找回密码
 立即注册
首页 业界区 业界 从Mono脚本生成Entity:深入理解Unity DOTS中的Archetyp ...

从Mono脚本生成Entity:深入理解Unity DOTS中的Archetype、Chunk与Entity结构设计

汝雨竹 2025-9-26 11:33:26
Unity 的 DOTS(Data-Oriented Technology Stack)是面向性能极致优化的一种架构范式,其底层结构设计并非偶然,而是深思熟虑的结果。本篇文章将从开发者最熟悉的入口——MonoBehaviour 脚本 + Baker 入手,逐步剖析 DOTS 中 Entity 是如何生成与组织的,并深入理解其底层架构:Archetype、Chunk、Entity 的设计逻辑和动机。
一、从 MonoBehaviour + Baker 生成 Entity 说起

在 Unity DOTS 中,我们通过 Authoring + Baker 的方式将传统的 GameObject 转换为 Entity。一个常见的写法如下:
  1. public class MonsterAuthoring : MonoBehaviour
  2. {
  3.     public int MonsterType;
  4.     class Baker : Baker<MonsterAuthoring>
  5.     {
  6.         public override void Bake(MonsterAuthoring authoring)
  7.         {
  8.             var entity = GetEntity(TransformUsageFlags.Dynamic);
  9.             AddComponent(entity, new Health { Value = 100 });
  10.             AddComponent(entity, new Translation { Value = float3.zero });
  11.             AddSharedComponent(entity, new MonsterType { TypeId = authoring.MonsterType });
  12.         }
  13.     }
  14. }
复制代码
表面上看,我们只是在添加组件。然而在背后,Unity DOTS 会根据这些组件自动为这个 Entity 创建归属结构——Archetype,并为其分配内存空间——Chunk。
二、Entity 是什么?

Entity 是 DOTS 中最基本的单位,但本身并不存储任何数据,它只是一个引用句柄:
  1. public struct Entity
  2. {
  3.     public int Index;     // 在内部数组中的位置
  4.     public int Version;   // 生命周期安全检测用
  5. }
复制代码
Entity 代表的是一个“ID”,它的数据存在 Chunk 中,它的组件定义了它的“能力和状态”。
三、Archetype:组件组合定义实体结构

当你给一个 Entity 添加了多个组件时,Unity 会自动根据这些组件的集合定义一个 Archetype。它可以理解为一个“结构签名”:
例如:
  1. Archetype A = [Translation, Health, MonsterType]
  2. Archetype B = [Translation, Velocity]
复制代码
所有具有相同组件组合的 Entity 都属于同一个 Archetype。这样做的好处是:

  • 可以快速定位拥有某些组件的所有实体
  • 方便数据批处理
  • 支持结构化存储(方便内存布局)
四、Chunk:结构化内存块

每个 Archetype 拥有若干个 Chunk。Chunk 是 DOTS 中用于存储实体数据的最小单位。
✅ Chunk 特点:


  • 大小固定为 16KB(Unity 内部固定)
  • 所有 Entity 的组件数据按列式存储
  • 每个 Chunk 只容纳一种 Archetype 的实体
  • 同一个 Chunk 中所有 Entity 的 SharedComponent 值必须一致

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

昨天 05:47

举报

不错,里面软件多更新就更好了
您需要登录后才可以回帖 登录 | 立即注册