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 = [Translation, Health, MonsterType]
- Archetype B = [Translation, Velocity]
复制代码 所有具有相同组件组合的 Entity 都属于同一个 Archetype。这样做的好处是:
- 可以快速定位拥有某些组件的所有实体
- 方便数据批处理
- 支持结构化存储(方便内存布局)
四、Chunk:结构化内存块
每个 Archetype 拥有若干个 Chunk。Chunk 是 DOTS 中用于存储实体数据的最小单位。
✅ Chunk 特点:
- 大小固定为 16KB(Unity 内部固定)
- 所有 Entity 的组件数据按列式存储
- 每个 Chunk 只容纳一种 Archetype 的实体
- 同一个 Chunk 中所有 Entity 的 SharedComponent 值必须一致
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |