为了性能考虑,所有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而已)还会