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的具體存儲排列如圖