Unity-ECS-实践
Archetypes原型 (它的存在使得遍历组件的命中率非常高)
- Archetype是一个容器,Unity规定每个ArcheType的大小16kb,不够就再开。始终保存内存的连续性
World 世界
- World包含EntityManager、ComponentSystems、Achetypes(原型)
- ECS默认提供一个世界。
- 世界之间不具备互通性。
简单从MonoBehavior创建Entity
// Create entity prefab from the gameobject hierarchy once
var setting = GameObjectConversionSettings.FromWorld(World.DefaultGameObjectInjectionWorld, null);
var prefabEntity = GameObjectConversionUtility.ConvertGameObjectHierarchy(prefab, setting);
var entityManager = World.DefaultGameObjectInjectionWorld.EntityManager;
// Efficiently instantiate a bunch of entities from the already converted entity prefab
var instance = entityManager.Instantiate(prefabEntity);
//SetComponentData
entityManager.SetComponentData(instance,new Translation{Value = Vector3.zero});
数据存储相关
Chunk的概念
Chunk是Unity ECS中特有的一个数据结构,在ECS部分代码中有大量使用,通常是指用来存放Component信息的与ArchetypeChunk,此外还有更一般的Chunk通过ChunkAllocator进行开辟,可以存放ArcheType中的各类型信息,大小和存储结构都与ArchetypeChunk不同,此处的Chunk特指存放ArcheType中Component信息的ArchetypeChunk。Chunk有以下几个特点:
EntityManager会将Component数据存放在固定的16kb大小的Chunk中(可以在Chunk定义中找到指定大小kChunkSize)
每个Chunk结构包含了这个区块中内容的相关信息
每个EntityArchetype都包括了一个Chunk的独特集合
一个chunk只能存在于一个archetype中
一个ArchetypeChunk结构是一个到具体Chunk的指针
每一个Chunk中包含的内容有:
一个指向其所归属的Archetype的指针
一个可以容纳多少个该Archetype类型Component数据的容量(Capacity)以及当前存放个数(Count),容量由Chunk的总大小除以单个Archetype所有Component大小之和得到
一个关于SharedComponentData值的索引(indices)数组,每个Chunk对于每种SharedComponentData类型只会存放一份具体值,所有在该Chunk上的Entity数据共享该值。
一个ChangeVersion表明该Chunk上每一种Component上一次被修改的时机
Entity中各ComponentData的具体数据,这边相同的类型的ComponentData会被放在一起,一种类型结束才是下一种
Chunk中正式ComponentData数据内容从Buffer字段开始,ComponentData的具体存储排列如图