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

2023-11-02 05:28

本文主要是介绍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。

今天的 Managed Component 与Unmanged Component分析比较就到这里了,更多的DOTS系列,关注我们,持续更新!

这篇关于Unity DOTS系列之托管/非托管Component的区别与性能分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/328426

相关文章

Vue和React受控组件的区别小结

《Vue和React受控组件的区别小结》本文主要介绍了Vue和React受控组件的区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录背景React 的实现vue3 的实现写法一:直接修改事件参数写法二:通过ref引用 DOMVu

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱

深度剖析SpringBoot日志性能提升的原因与解决

《深度剖析SpringBoot日志性能提升的原因与解决》日志记录本该是辅助工具,却为何成了性能瓶颈,SpringBoot如何用代码彻底破解日志导致的高延迟问题,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言第一章:日志性能陷阱的底层原理1.1 日志级别的“双刃剑”效应1.2 同步日志的“吞吐量杀手”

Go之errors.New和fmt.Errorf 的区别小结

《Go之errors.New和fmt.Errorf的区别小结》本文主要介绍了Go之errors.New和fmt.Errorf的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考... 目录error的基本用法1. 获取错误信息2. 在条件判断中使用基本区别1.函数签名2.使用场景详细对

Redis中哨兵机制和集群的区别及说明

《Redis中哨兵机制和集群的区别及说明》Redis哨兵通过主从复制实现高可用,适用于中小规模数据;集群采用分布式分片,支持动态扩展,适合大规模数据,哨兵管理简单但扩展性弱,集群性能更强但架构复杂,根... 目录一、架构设计与节点角色1. 哨兵机制(Sentinel)2. 集群(Cluster)二、数据分片

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

C#和Unity中的中介者模式使用方式

《C#和Unity中的中介者模式使用方式》中介者模式通过中介者封装对象交互,降低耦合度,集中控制逻辑,适用于复杂系统组件交互场景,C#中可用事件、委托或MediatR实现,提升可维护性与灵活性... 目录C#中的中介者模式详解一、中介者模式的基本概念1. 定义2. 组成要素3. 模式结构二、中介者模式的特点

一文带你迅速搞懂路由器/交换机/光猫三者概念区别

《一文带你迅速搞懂路由器/交换机/光猫三者概念区别》讨论网络设备时,常提及路由器、交换机及光猫等词汇,日常生活、工作中,这些设备至关重要,居家上网、企业内部沟通乃至互联网冲浪皆无法脱离其影响力,本文将... 当谈论网络设备时,我们常常会听到路由器、交换机和光猫这几个名词。它们是构建现代网络基础设施的关键组成

redis和redission分布式锁原理及区别说明

《redis和redission分布式锁原理及区别说明》文章对比了synchronized、乐观锁、Redis分布式锁及Redission锁的原理与区别,指出在集群环境下synchronized失效,... 目录Redis和redission分布式锁原理及区别1、有的同伴想到了synchronized关键字

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按