当前位置: 首页 > news >正文

Unity DOTS系列之托管/非托管Component的区别与性能分析

最近DOTS发布了正式的版本, 我们来分享一下DOTS里面托管与非托管Component的区别与性能分析,方便大家上手学习掌握Unity DOTS开发。托管与非托管的区别在于是不是基于自动垃圾回收的。托管是由垃圾回收器来负责自动回收,非托管需要我们手动来做相关内存管理,不被垃圾回收系统来处理。

对惹,这里有一个游戏开发交流小组,大家可以点击进来一起交流一下开发经验呀!

Unmanaged Component(非托管)

先来看下Unmanaged Component,它是我们在DOTS开发中使用最多的,性能最好的Component的类型。它的数据成员的类型会有一些限制:

  1. Blittable types: 这些类型可以在托管与非托管都有通用的表现形势,不需要额外的转换,如System.Byte,System.Int32等,具体可以参考Blittable types的详细解释(https://learn.microsoft.com/en-us/dotnet/framework/interop/blittable-and-non-blittable-types);
  2. bool与char类型;
  3. BlobAssetReference类型:Blob asset 的对象的引用;
  4. Collections.FixedString类型: 一个固定大小的character buffer;
  5. Collections.FilxedList 类型: 一个固定大小的List;
  6. FixedArray类型: 固定大小的一个数组类型,只能在unsafe环境中使用;
  7. 数据成员满足上面类型条件的其它结构体

创建一个Unmanaged Component除了有上面数据成员类型的限制以外,你还要定义一个struct继承自 IComponentData。代码如下:

public struct ExampleChunkComponent : IComponentData
{public int Value;
}

如果你定义了一个struct 继承自 IComponentData 但是里面没有加任何的数据,那么这种Component被称为Tag Component,在开发中用来做特定标记某些Entity。 Unmanaged Component的内存是基于ArchType分配在Chunk中的。它与所在Entity的其它Unmanaged Component基于ArchType排列在一起,这样可以获得很好的性能,因此Unmanaged Component在ECS开发中是最常用的一种组件数据类型。拥有很好的性能。

Managed Component(托管)

与Unmanaged Component相比,Managed Component可以使用任意类型的数据成员。但是在存储与访问中性能会不如Unmanaged Component。它更灵活方便,但是性能不及Unmanaged Component。同时它也由一些使用方面的限制:

  1. 不能够在jobs工作线程里面来使用Managed Component。
  2. 在使用Burst编译器编译的代码中不能使用Managed Component。
  3. 他们需要基于垃圾回收;
  4. 为了序列化,他们必须要定义一个没有参数的构造函数;

如果Managed Component中使用了托管的数据类型,可能需要手动添加序列化,Clone,比较等功能。定义一个Managed Component也非常简单,你只要定义一个class,继承自IComponentData,这样就定义好了一个Managed Component(注意非托管的是定义struct)。要么就不要构造函数,要么就定义一个没有参数的构造函数。参考代码如下:

public class ExampleManagedComponent : IComponentData
{public int Value;
}

当我们的Managed Component引用了其它的一些引用而外资源的时候,我们最好实现ICloneable与IDisposable。例如,一个Managed Component有一个数据成员ParticleSystem,指向了一个粒子对象。当我们复制这个组件所在的Entity的时候。如果你实现了Icloneable,你就可以把这个ParticalSystem的引用复制给另外一个Component。如果你实现了IDisposable,这样你也可以基于这个机制来释放你的资源。

托管与非托管Component的性能比较

Managed Component的数据不直接存放在Chunk中,World会有一个很大的”数组”,专门来存放Managed Component,而我们Entity的基于ArchType的Component数据块中存放的是Managed Component的在数组中的偏移地址。这样当我们访问Managed Component的时候,需要查找,同时内存会跳开到别的地方,这样会导致Cache失效,所以性能会差一些。

Unmanaged Component的数据直接一起存放到Chunk中,这样访问的时候会非常高效,同时Cache命中率也会很高。同时UnmangedComponent可以直接在Burst Code中使用,能获得很好的执行性能。Unmanged Component的性能要比Managed Component的性能要好,这样大多数情况下我们尽可能用Unmanaged来代替Managed。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 一起操作一遍git,还不会你找我
  • tensorflow算子调用示例(MINIST)
  • 【项目实战】如何在项目中基于 Spring Boot Starter 开发简单的 SDK
  • ARM基础知识点及简单汇编语法
  • 【数据结构-栈】力扣71. 简化路径
  • 【计算机网络 - 基础问题】每日 3 题(二十一)
  • YOLOv8 OBB win10+ visual 2022移植部署
  • 【2023次方 / B】
  • 王红梅老师ppt介绍算法设计一般过程---对上周csdn的补充----可以参考老版教师用书--单链表专题在介绍插入时介绍了正向思维方法,这是更详细的解释跟全面
  • iptables和nftables
  • 淘客系统开发之卷轴模式系统源码功能分析
  • 解锁视频生成新时代! 探索智谱CogVideoX-2b:轻松生成6秒视频的详细指南
  • ReKep——李飞飞团队提出的让机器人具备空间智能:基于视觉语言模型GPT-4o和关系关键点约束
  • C语言常见字符串函数模拟实现一:(strlen,strcpy,strcat,strcmp,strstr )
  • 最新最详细的Mastercam安装包下载安装教程(保姆级)
  • 【Linux系统编程】快速查找errno错误码信息
  • 【笔记】你不知道的JS读书笔记——Promise
  • 5、React组件事件详解
  • Android Studio:GIT提交项目到远程仓库
  • CentOS6 编译安装 redis-3.2.3
  • css系列之关于字体的事
  • CSS相对定位
  • input实现文字超出省略号功能
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • Sequelize 中文文档 v4 - Getting started - 入门
  • VUE es6技巧写法(持续更新中~~~)
  • Zepto.js源码学习之二
  • 仿天猫超市收藏抛物线动画工具库
  • 基于Android乐音识别(2)
  • 微信公众号开发小记——5.python微信红包
  • 微信开放平台全网发布【失败】的几点排查方法
  • 写代码的正确姿势
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • #define、const、typedef的差别
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #Linux(帮助手册)
  • #Lua:Lua调用C++生成的DLL库
  • $().each和$.each的区别
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (55)MOS管专题--->(10)MOS管的封装
  • (C++20) consteval立即函数
  • (C语言)fgets与fputs函数详解
  • (el-Date-Picker)操作(不使用 ts):Element-plus 中 DatePicker 组件的使用及输出想要日期格式需求的解决过程
  • (web自动化测试+python)1
  • (附源码)c#+winform实现远程开机(广域网可用)
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (转)http-server应用
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • .dwp和.webpart的区别
  • .Net Core中Quartz的使用方法
  • .NET Project Open Day(2011.11.13)