从Mono脚本生成Entity:深入理解Unity DOTS中的Archetype、Chunk与Entity结构设计
Unity 的 DOTS(Data-Oriented Technology Stack)是面向性能极致优化的一种架构范式,其底层结构设计并非偶然,而是深思熟虑的结果。本篇文章将从开发者最熟悉的入口——MonoBehaviour 脚本 + Baker 入手,逐步剖析 DOTS 中 Entity 是如何生成与组织的,并深入理解其底层架构:Archetype、Chunk、Entity 的设计逻辑和动机。一、从 MonoBehaviour + Baker 生成 Entity 说起
在 Unity DOTS 中,我们通过 Authoring + Baker 的方式将传统的 GameObject 转换为 Entity。一个常见的写法如下:
public class MonsterAuthoring : MonoBehaviour
{
public int MonsterType;
class Baker : Baker<MonsterAuthoring>
{
public override void Bake(MonsterAuthoring authoring)
{
var entity = GetEntity(TransformUsageFlags.Dynamic);
AddComponent(entity, new Health { Value = 100 });
AddComponent(entity, new Translation { Value = float3.zero });
AddSharedComponent(entity, new MonsterType { TypeId = authoring.MonsterType });
}
}
}表面上看,我们只是在添加组件。然而在背后,Unity DOTS 会根据这些组件自动为这个 Entity 创建归属结构——Archetype,并为其分配内存空间——Chunk。
二、Entity 是什么?
Entity 是 DOTS 中最基本的单位,但本身并不存储任何数据,它只是一个引用句柄:
public struct Entity
{
public int Index; // 在内部数组中的位置
public int Version; // 生命周期安全检测用
}Entity 代表的是一个“ID”,它的数据存在 Chunk 中,它的组件定义了它的“能力和状态”。
三、Archetype:组件组合定义实体结构
当你给一个 Entity 添加了多个组件时,Unity 会自动根据这些组件的集合定义一个 Archetype。它可以理解为一个“结构签名”:
例如:
Archetype A =
Archetype B = 所有具有相同组件组合的 Entity 都属于同一个 Archetype。这样做的好处是:
[*]可以快速定位拥有某些组件的所有实体
[*]方便数据批处理
[*]支持结构化存储(方便内存布局)
四、Chunk:结构化内存块
每个 Archetype 拥有若干个 Chunk。Chunk 是 DOTS 中用于存储实体数据的最小单位。
✅ Chunk 特点:
[*]大小固定为 16KB(Unity 内部固定)
[*]所有 Entity 的组件数据按列式存储
[*]每个 Chunk 只容纳一种 Archetype 的实体
[*]同一个 Chunk 中所有 Entity 的 SharedComponent 值必须一致
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! 不错,里面软件多更新就更好了
页:
[1]