首页 > 其他分享 >Unity DOTS系列之Struct Change核心机制分析

Unity DOTS系列之Struct Change核心机制分析

时间:2023-12-04 09:45:17浏览次数:39  
标签:DOTS Struct ArchType Entity Unity 内存 Change

最近DOTS发布了正式的版本, 我们来分享一下DOTS里面Struct Change机制,方便大家上手学习掌握Unity DOTS开发。

基于ArchType与Chunk的Entity管理机制

我们回顾以下ECS的内存管理核心机制,基于ArchType+Chunk的Entity管理模式。每个Entity不直接存放数据,数据全部存放到ComponentData里面。每个类型的Entity,会把它所有的ComponentData的组合在一起。每种类型的Entity都会得到”一种组合类型”,我们把它叫做ArchType。每种类型的Enitity对应一种ArchType。如果有新的类型的Entity出来,系统就会有新的一种ArchType。ArchType对应的内存块都是由Chunk统一分配,每个Chunk只会分配一种ArchType的内存块。

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

...

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

...

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

ArchType3:

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

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

...

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

Struct Change机制

当我们操作entity中的ComponentData的时候,有可能导致Struct Change,及原来的ArchType以已经不适合新的Entity了,必须要产生新的ArchType来存放数据,这种我们叫做Struct Change。以下操作会导致Struct Change发生:

  1. 创建or删除一个Entity:
    Unity会从当前Entity类型的ArchType里面找到一个chunk, 把第一个空闲的内存块分配分配出来。如果当前的chunk都满了,就重新向操作系统分配一个chunk内存页出来。当删除一个entity的时候,先找到内存块所在的chunk,找到内存块在chunk中的偏移位置,把最后一个entity的component数据复制到刚才释放的内存块中,把最后的那个内存块释放出来,供一下分配。
  2. 添加或删除一个组件数据:
    当我们给entity添加or删除一个组件数据的时候,意味着前后是不同的ArchType(因为改变了组合类型)。所以要先释放原来ArchType对应的内存块,然后在新的ArchType里面再找Chunk来分配出Entity的新的ComponentData内存块。
  3. 修改了同一类型Entity共用的ShareComponent数据:

Struct Change的代价与开销

Struct Change引发的开销是非常大的,所以当我们基于DOTS来开发的时候,你要能清楚的知道Struct Change的开销。Struct Change开销,除了要重新从chunk里面分配内存块,复制数据以外,还有同步点的开销,同步点你可以理解为一个锁,当发生了Strcut Change的时候,为了保证正确性,系统会生成一个同步点,这样其它的要使用这个数据的线程都会被挂起,直到Struct Change操作完成。

Struct Change还会导致之前系统里面的组件引用失效,所以当发生Struct Change的时候,还要重新更新引用数据,保证后面数据的正确。从上面来看Struct Change开销确实很大,特别是每次修改还要获取同步点,同步点会导致系统的吞吐量下降,我们可以考虑把所有的Struct Change延后一起发生,这样可以只请求一个同步点的基础上把所有的Struct Change全部处理掉。

今天的Aspect机制,就给大家分享到这里了,更多的DOTS系列,关注我们,持续更新!

标签:DOTS,Struct,ArchType,Entity,Unity,内存,Change
From: https://www.cnblogs.com/bycw/p/17874260.html

相关文章

  • std::is_trivially_destructible的作用
    template<classTy>voiddestroy(Ty*pointer){destroy_one(pointer,std::is_trivially_destructible<Ty>{});}这样设计的好处主要体现在对泛型编程和内存管理的灵活性上。下面是一些可能的好处:1.**泛型性质:这种设计允许`destroy_one`在不同的上下文中使用,因为它是模......
  • Unity学习笔记--数据持久化Json
    JSON相关json是国际通用语言,可以跨平台(游戏,软件,网页,不同OS)使用,json语法较为简单,使用更广泛。json使用键值对来存储。认识json文件//注意字典类型存储时,键是以string类型存储的需要添加“”{"name":"TonyChang","age":21,"sex":true,"Float":2.5,"arrarys"......
  • (自用)基于unity的指令(命令)模式
    指令模式1.配置输入 所有游戏中都包含玩家输入指令的部分(这些部分通常写在游戏循环中如unity中的UpData())游戏会每一帧都进行一次读取,当玩家按下相应按键时则会进行对应方法 为了可以时刻检测并记录玩家进行的操作,或者对某个对应的操作的指令进行更改,我们需要将这些......
  • 使用unity开发Pico程序,场景中锯齿问题
    1、问题使用unity【非HDR】开发Pico程序,场景中锯齿问题,设置了unity的抗锯齿和渲染方式,及悬挂抗锯齿的脚本,都不能很好的解决项目中图片、文字的锯齿问题,通过摸索找到了妥善的方法1、修改项目中图片的GenerateMIpMaps为勾选状态,MipMapsPreserveCoverage这个可以未勾选,若是勾选......
  • Unity实现的行为树
    游戏AI行为决策——行为树前言行为树,是目前游戏种应用较为广泛的一种行为决策模型。这离不开它成熟的可视化编辑工具,例如Unity商城中的「BehaviourDesigner」,甚至是虚幻引擎也自带此类编辑工具。而且它的设计逻辑并不复杂,其所利用的树状结构,很符合人的思考方式。接下来,我们会......
  • Unity builtin GUIStyle内置样式
    https://gist.github.com/bikrone/666bb26fb0d4468df12c890ecc6c512eusingUnityEditor;usingUnityEngine;publicsealedclassExampleClass:EditorWindow{privatestaticreadonlystring[]mList={"AboutWIndowLicenseLabel"......
  • Unity学习笔记--数据持久化XML文件(2)
    IXmlSerializable接口:使用该接口可以帮助处理不能被序列化和反序列化的特殊类得到处理,使特殊类继承IXmlSerializable接口,实现其中的读写方法,检测到读写方法被重写之后,便会按照自定义实现的接口来实现方法。usingSystem;usingSystem.IO;usingSystem.Runtime.InteropServi......
  • 如何拆解Unity 2022.3版本的AssetBundle
    1)如何拆解Unity2022.3版本的AssetBundle2)Unity2022LTS版本的稳定性3)关于AssetBundle禁用TypeTree之后的一些可序列化的问题这是第363篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地掌握和学习。UWA社区主页:community.......
  • Unity2D中瓦片地图的创建与绘制教程
    Unity2D中瓦片地图的创建与绘制素材切割创建地图创建瓦片绘制地图瓦片调色板画笔拓展素材资源链接素材切割选中以下素材,以Tiles为例(素材链接在文章最下方)修改素材属性。将SpriteMode属性改为Multiple多张(不然切割不了);PixelsPerUnit改为16像素;FilterMode改为Point(nofilte......
  • Unity3D角色移动控制脚本
    Unity3D角色移动控制脚本键盘控制方向鼠标控制方向键盘控制方向privateCharacterControllercontroller;publicfloatSpeed=1f;publicfloatRotateSpeed=1f;voidStart(){ controller=transform.GetComponent<CharacterController>();}voidUpdate(){ //键盘......