首页 > 其他分享 >Unity DOTS中ECS核心架构详解

Unity DOTS中ECS核心架构详解

时间:2023-11-06 14:01:05浏览次数:37  
标签:DOTS ArchType Entity Unity ECS 内存 组件 World

最近DOTS终于发布了正式的版本, 我们来分享一下DOTS中ECS的几个关键概念与结构,方便大家上手学习掌握Unity DOTS开发。

 

ECS中的World

  Unity DOTS ECS架构中所有的Entity都是被放到了World对象里面,每个Entity在World里面都有唯一的Id号。Unity DOTS 可以同时支持很多个World, DOTS会在运行的时候创建一个默认的World。World包含了它所需的所有System, System迭代计算的时候,使用World里面的Entity中的Component数据。如果不想要一运行就创建一个默认的World,我们可以通过以下宏开关来控制:

#UNITY_DISABLE_AUTOMATIC_SYSTEM_BOOTSTRAP_RUNTIME_WORLD

关闭运行模式下启动的时候,创建一个默认的World;

#UNITY_DISABLE_AUTOMATIC_SYSTEM_BOOTSTRAP_EDITOR_WORLD

关闭编辑器模式下创建默认的World对象;

#UNITY_DISABLE_AUTOMATIC_SYSTEM_BOOTSTRAP

关闭掉编辑器模式/运行模式下的默认的World的创建;

EntityManager对象

  每个World, 有且只有一个EntityManager对象。EntityManager对象负责Entity的管理,包含但不限于: 创建Entity, 销毁Entity, 修改Entity中的数据等。

Entity对象

    DOTS 中的每一个实体,我们称为Entity, 它本身是一个容器,可以理解为一个轻量级的gameObject, 它的数据全部存放在它的对应的组件里面。Entiy里面的所有组件数据内存会并行一起排布。这样保证了Entity 数据内存的高效访问与Cache命中。相当于把Entity所包含的所有组件数据的内存打包到一个内存块中。比如一个A类Entity, 它包含了有M,N两个组件数据,当我们给Entity来分布组件数据内存的时候,是把M+N两个组件的内存看作一种类型,线性排布在一起分配。存储数据的时候M,就操作这个内存块的M的部分。操作N组件数据的时候,就操作这个内存块的N的部分。Entity中的所有组件组成的内存块看作的这个类型,我们叫做ArchType。相同类型的Entity(所有组件的组成结构相同)属于同一种ArchType。

 

ArchType与Chunk高效的内存分配器

高效的内存分配器需要具备几个特点:

  1: 高效地分配与释放;

  2: 避免大量的分配与释放后造成的内存碎片;

上文提到,Entity中的所有组件数据是排布在一块内存里面的,每一种不同的排布,就会对应一种"类型"ArchType, DOTS 高效的内存分配器只需要基于ArchType所对应的内存块大小来进行分配就可以了。DOTS的entity组件数据的内存分配器基于Chunk设计,每个Chunk的大小为16kb,每个Chunk只会分配同一种类型的ArchType, 根据ArchType的组件组合,我们就可以计算出它们一共所需要的内存大小,我们就从Chunk中固定分配对应的内存大小就可以了,这样Entity对应的所有组件内存非常高效的分配与释放,同时每种Chunk只存放一种ArchType类型的内存块,每次分配的内存大小都是一样,这样可以避免内存碎片。基于ArchType的内存排布如下所示:

===============================

ArchType1:

chunk1【e1(c1c2),e2(c1c2),e3(c1c2)】

chunk2【e4(c1c2),e5(c1c2),e6(c1c2)】

...

======================

ArchType2:

chunk1【e1(c3c4),e2(c3c4),e3(c3c4)】

chunk2【e4(c3c4),e5(c3c4),e6(c3c4)】

...

===============================

ArchType3: 

chunk1【e1(c5c6),e2(c5c6),e3(c5c6)】

chunk2【e3(c5c6),e4(c5c6),e5(c5c6)】

...

===============================

System与JobSystem

   我们学C语言的时候,听到过一句名言,程序=数据结构+算法。Entity解决了数据存储的问题,System就是算法。算法所需要的数据,来源于Entity中的Component。DOTS提供机制,System可以访问到entity中的组件数据,拿到这些数据后再做逻辑迭代计算与处理。默认System是运行在Unity的main thread上的,为了发挥多核优势,把可以用多线程处理的任务使用多线程,Unity 还提供了JobSystem机制,通过多线程的线程池来迭代计算JobSystem,不放main thread上提升程序的效率。

 

总结如下:

DOTS中会有一个World对象,每个Word对象会有一个EntityManager负责Entity的管理,内部使用了高效的基于ArchType与Chunk机制的内存分配。所有的system会加入到World里面来进行统一迭代,System可以访问Entity中的Component数据。同时JobSystem可以让我们的算法迭代基于多线程处理。配上总结图如下:

 

 

标签:DOTS,ArchType,Entity,Unity,ECS,内存,组件,World
From: https://www.cnblogs.com/rainy1unity/p/17812471.html

相关文章

  • 半导体基础SECS协议(SECS-I)
    阅读导言可知,在SECS协议的基础结构中,SECS-I是一项物理链路协议,采用了R232串口的物理连接方式,定义设备在链路上使用的消息格式以及一些消息交互行为。以下介绍将大致以消息传输与消息格式两部分进行。1.消息传输-物理传输*:STARTBitLSB1 2 3 4......
  • Unity ECS最新DOTS环境搭建教程
    最近DOTS终于发布了正式的版本, 今天我们来基于Unity2023.1.6来搭建DOTS1.0.16的开发环境与注意事项。 1获取DOTS的在线文档   UnityDOTS的权威资料比较少,我们主要的都是基于DOTS的官方文档来进行学习和使用。UnityDOTS的官方文档的下载地址:https://docs.unity3d.c......
  • unity游戏发布调试
    详见unity手册-平台开发-独立平台1.unity内运行正常,平台运行失败-build-DevelopmentBuild勾选根据平台上的DevelopmentBuild信息,有以下原因1)第三方库与.net的依赖-playerSetting-Other-Configuration&APICompatiblityLevel2.playerSetting2.性能分析-build-AutoconnectPro......
  • ECS、宝塔
    一、配置yum源为阿里解决地址:https://blog.csdn.net/m0_37903789/article/details/84402084二、配置宝塔......
  • 记一次Unity性能优化
    Beforeyoumakeanychanges,youmustprofileyourapplicationtoidentifythecauseoftheproblem.Ifyouattempttosolveaperformanceproblembeforeyouunderstanditscause,youmightwasteyourtimeormaketheproblemworse.——unity文档在改代码......
  • unity 点击,长按和双击
    转自:Unity单击、双击、长按事件处理_unitybutton长按事件_司军礼的博客-CSDN博客原理:1.将操作抽象成三个类:ClickButton,DoubleClickButton,PressButton并实现各自的生命周期函数:ClickButton:OnPointerDown启动监测,OnPointerUp:调用点击成功事件DoubleClickButton:OnPointerDown启......
  • 从FrameDebugger看Unity渲染
     Unity如何渲染一个3D+2D的游戏画面,今天通过FrameDebugger来看下Unity内置渲染管线的渲染策略, 后续再出一些URP渲染管线相关的文章。    Unity渲染场景的几个主要部分    Unity内置渲染管线是基于摄像机来进行渲染的,每个摄像机按照摄像机的渲染顺序来依次渲染,渲......
  • 半导体基础SECS协议(导言)
    SECS,全称SEMIEquipmentCommunicationStandards(SEMI设备通讯标准),SECS基础一般包括以下四个标准—— SECS-I、SECS-II、GEM以及HSMS,它们间的层次结构大致如下图所示: 其中,SECS-I与HSMS都规定了设备在物理链路上的消息格式、传输行为等内容,区别在于使用的物理实......
  • Unity DOTS系列之Struct Change核心机制分析
    最近DOTS发布了正式的版本,我们来分享一下DOTS里面StructChange机制,方便大家上手学习掌握UnityDOTS开发。基于ArchType与Chunk的Entity管理机制  我们回顾以下ECS的内存管理核心机制,基于ArchType+Chunk的Entity管理模式。每个Entity不直接存放数据,数据全部存放到Component......
  • Unity-Android 权限相关问题
    1.生成AndroidManifestFile->buildSetting->playerSetting->Android->publishingSettings权限添加位置:<?xmlversion="1.0"encoding="utf-8"?><manifestxmlns:android="http://schemas.android.com/apk/res/android......