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

相关文章

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

黑神话,XSKY 星飞全闪单卷性能突破310万

当下,云计算仍然是企业主要的基础架构,随着关键业务的逐步虚拟化和云化,对于块存储的性能要求也日益提高。企业对于低延迟、高稳定性的存储解决方案的需求日益迫切。为了满足这些日益增长的 IO 密集型应用场景,众多云服务提供商正在不断推陈出新,推出具有更低时延和更高 IOPS 性能的云硬盘产品。 8 月 22 日 2024 DTCC 大会上(第十五届中国数据库技术大会),XSKY星辰天合正式公布了基于星

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

MOLE 2.5 分析分子通道和孔隙

软件介绍 生物大分子通道和孔隙在生物学中发挥着重要作用,例如在分子识别和酶底物特异性方面。 我们介绍了一种名为 MOLE 2.5 的高级软件工具,该工具旨在分析分子通道和孔隙。 与其他可用软件工具的基准测试表明,MOLE 2.5 相比更快、更强大、功能更丰富。作为一项新功能,MOLE 2.5 可以估算已识别通道的物理化学性质。 软件下载 https://pan.quark.cn/s/57

native和static native区别

本文基于Hello JNI  如有疑惑,请看之前几篇文章。 native 与 static native java中 public native String helloJni();public native static String helloJniStatic();1212 JNI中 JNIEXPORT jstring JNICALL Java_com_test_g