Unity2018 ECS框架Entities源码解析(二)组件与Chunk的内存布局

Unity的ECS框架中,为了优化性能,Entity的组件数据存储在Chunk内存空间。Chunk按照EntityArchetype分配,每个Archetype对应一组组件集合和Chunk数组。创建新Entity时,会预计算组件大小和偏移,分配Chunk内存,并在需要时扩展m_Entities数组。本文详细解析了Entity、Archetype、Chunk的关系以及创建和访问组件数据的过程。
摘要由CSDN通过智能技术生成

为了性能考虑,所有Entity里的组件数据都会存放在被称为Chunk的连续内存空间里,因为cpu访问某内存时会顺便加载附近的一段数据,所以数据的连续存放有利于提高缓存命中。

当然,并不是所有的A组件的值都放在同一个Chunk里的,Chunk是按EntityArchetype分配的。EntityArchetype核心是Archetype类,其实就是一个组件的数组,拥有相同组件集合的Entity指向相同的Archetype,Archetype对应一个Chunk数组,Chunk是一个固定大小的缓存空间,当一个Chunk空间用光了就创建多一个。

当你对一个特定的entity调用EntityManager:AddComponent时传入A组件就会获取或创建一个仅有A的Archetype(拥有相同组件集合的Archetype只会存在一份,由ArchetypeManager.m_TypeLookup管理),再次调用AddComponent传入B组件时就会创建一个{A,B}组件集合的Archetype,并把之前A组件的数据复制到新的Archetype指向的Chunk上,所以官方也推荐先创建好EntityArchetype来CreateEntity,或者一次性传入所有需要的组件。

创建Archetype时会预计算好各个组件占用的字节大小和内存偏移等信息,然后分配一段固定大小的内存空间给Chunk。在取某Entity某组件数据时就找到该Chunk,根据自己的IndexInChunk和组件在Chunk里的偏移就可以访问到了。

我们先看看创建一个Entity时做的操作:

首先我们知道Entity只是一个Index,关于它的信息都交由EntityDataManager管理,m_Entities数组就是干这个用的(注意Entity的值(Index和Version两int而已)还会

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值