首页 > 编程语言 > 详细

Unity-ECS-实践

时间:2020-05-14 20:15:16      阅读:56      评论:0      收藏:0      [点我收藏+]

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的具体存储排列如图
技术分享图片

Unity-ECS-实践

原文:https://www.cnblogs.com/Jaysonhome/p/12890384.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!