Unity DOTS中的share component

server/2024/12/24 9:33:06/

Unity DOTS中的share component

  • 内存管理
  • 创建流程
  • 修改流程
  • 销毁流程
  • Reference

share component是DOTS中一类比较特殊的component,顾名思义,它是全局共享的component,所有具有相同component值的entity,共享一个component,这就避免了数据的冗余。但是相应地,如果修改了某个entity上的share component值,则会触发structural change,Unity不得不将entity挪到使用新值的chunk中去。这就是说,对entity上share component值的修改,并非是真的修改了它的值,而是触发了entity的重新分组。在简要了解过它的利弊之后,我们来看一下Unity内部是如何管理share component的。

内存管理

Archetype不直接保存share component的值,而是保存了一个index数组,这些index用来真正索引share component值。虽然不同share component值的entity位于不同的chunk,但是这些chunk都属于同一个Archetype。一个Archetype可能包含多个share component的值,但每个chunk的share component值只有一个。

在这里插入图片描述

share component index在数组中的排序规则如上图所示,首先按不同的type进行排序,同一type再按chunk的index进行排序。share component index只保存设置过值的share component,意味着如果我们只是简单地调用AddComponent,而没有显式SetSharedComponent,压根就不会新增share component index。这是因为此时share component的值为默认值,并不需要显式保存。

share component真正的值保存在一个全局的m_UnmanagedSharedComponentsByType变量中。它可以认为是一个list数组,不同的component type对应不同的数组下标,share component index则映射到某个list的下标。当然,每个list的长度不一定相同。

在这里插入图片描述

在Unity Archetypes窗口中,可以看到share component是单独显示的:

在这里插入图片描述

创建流程

向Entity添加一个share component的流程和普通component类似,第一步也是去寻找满足相同type的Archetype,然后再去找是否有可复用的chunk存在。只不过这里判断chunk可复用的条件和普通component不同,普通component只需要满足chunk有空闲的slots即可,而share component还需要chunk所对应的share component value也要一致才行,如果找不到则会新建一个。

在有了chunk之后,就和普通component一样,需要把entity从之前的chunk中move到新的chunk中去。

public bool AddComponent(Entity entity, ComponentType type)
{var dstChunk = GetChunkWithEmptySlotsWithAddedComponent(entity, type);if (dstChunk == ChunkIndex.Null)return false;Move(entity, dstChunk);return true;
}

修改流程

当真正调用SetSharedComponent为share component设置值时,share component才会真正地存储下来。Unity内部为了在m_UnmanagedSharedComponentsByType中快速找到下一个空闲的位置,还使用了一个辅助数据结构m_UnmanagedSharedComponentInfo,它也是一个list数组,每个list的头部记录了list中下一个空闲的位置,所有空闲的位置以链表的形式串联在一起,如果不存在,则需要对list进行扩容。list中空闲的位置就是对应share component的index。

在这里插入图片描述

index更新之后,此时还需要把entity从原来index的chunk挪到新的index的chunk去,但Archetype不会改变,Archetype只和类型的数量有关,而每个chunk都有一个对应的share component index。

public void SetSharedComponentData_Unmanaged(Entity entity,TypeIndex typeIndex,void* componentData,void* componentDataDefaultValue,in SystemHandle originSystem = default)
{var componentType = ComponentType.FromTypeIndex(typeIndex);var newSharedComponentDataIndex = InsertSharedComponent_Unmanaged(typeIndex, 0, componentData, componentDataDefaultValue);EntityComponentStore->SetSharedComponentDataIndex(entity, componentType, newSharedComponentDataIndex);
}

销毁流程

remove share component的流程和普通component完全相同,此时的entity因为少了一个component,不再属于原来的Archetype,需要迁移到新的Archetype中去。如果此时的entity身上还有share component,那依旧按照之前寻找chunk的规则处理。

public bool RemoveComponent(Entity entity, ComponentType type)
{var dstChunk = GetChunkWithEmptySlotsWithRemovedComponent(entity, type);if (dstChunk == ChunkIndex.Null)return false;Move(entity, dstChunk);return true;
}

Reference

[1] Introducing shared components


http://www.ppmy.cn/server/152735.html

相关文章

如何快速的给模特换头换圣诞场景

首先打开千鹿AI:千鹿AI:AI生图设计工具,每日免费300张 点击AI换模特功能 上传素材 选择想要生成模特的头 点击相应的场景 点击立即生成就可以啦

重拾设计模式--备忘录模式

文章目录 备忘录模式(Memento Pattern)概述定义: 作用:实现状态的保存与恢复支持撤销 / 恢复操作 备忘录模式UML图备忘录模式的结构原发器(Originator):备忘录(Memento)&…

[计算机网络]OSPF协议

开放最短路径优先OSPF 1)OSPF的工作方式 1>和谁交换消息 使用洪泛法,向本自治系统的所有路由器发送消息。 2>交换什么消息 发送的消息就是与本路由器相邻的所有路由器的链路状态,但这只是路由器所知道的部分信息。 链路状态就是说…

详解大模型多轮对话的输入和输出token序列

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于大模型算法的研究与应用。曾担任百度千帆大模型比赛、BPAA算法大赛评委,编写微软OpenAI考试认证指导手册。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。授权多项发明专利。对机器学…

面试题整理13----deployment和statefulset区别

面试题整理13----deployment和statefulset区别 1. Deployment2. StatefulSet3. 总结 Deployment 和 StatefulSet 是 Kubernetes 中两种常用的工作负载资源,它们都可以用来部署和管理 Pod 1. Deployment 无状态应用:Deployment 主要用于部署无状态的应用…

面试题整理4----lvs,nginx,haproxy区别和使用场景

LVS、Nginx、HAProxy:区别与使用场景 1. LVS(Linux Virtual Server)1.1 介绍1.2 特点1.3 使用场景 2. Nginx2.1 介绍2.2 特点2.3 使用场景 3. HAProxy3.1 介绍3.2 特点3.3 使用场景 4. 总结对比 在构建高可用、高性能的网络服务时&#xff0c…

Linux 下的 GPT 和 MBR 分区表详解

文章目录 Linux 下的 GPT 和 MBR 分区表详解一、分区表的作用二、MBR(Master Boot Record)1. **特点**2. **优点**3. **缺点**4. **适用场景** 三、GPT(GUID Partition Table)1. **特点**2. **优点**3. **缺点**4. **适用场景** 四…

智尚招聘求职小程序V1.0.18

微信小程序招聘管理系统。支持多城市、人才版块、招聘会、职场资讯、经纪人入驻等功能。提供全部无加密源码,支持私有化部署。 V1.0.18增加功能与修复一些BUG 1、增加过审机制(后台系统设置里开启)2、增加后台经纪派遣人才管理3、优化前端经纪派遣人功能4、修复前…