Unity Entities SubScene 烘焙主要流程
Unity Entities 有 SubScene 的概念,它允许场景之间存在嵌套关系,并通过 Bake 的方式预先烘焙数据到储存设备上,本篇说明记录 Unity Baking 的主要流程,为多平台 / 环境的烘焙区分做准备。
Unity Baking Scene 的主要流程如下:
Bake 流程专用的 World (_ConvertedWorld / _IncrementalConversionDebug.World / EditorScenesBakingWorld) 被创建
BakingSystem 被创建。该系统承担主要的 Baker Invoke 任务,该 System 执行结束后 authoring 的组件和 GameObject 将被转化为 ECS 概念中的实体和组件
- BakerDataUtility 被初始化
- 添加继承了 GameObjectBaker 和 Baker<> 的 Baker 类型到容器 _IndexToBakerInstances 中,并添加该 Baker 的程序集信息到 _BakersByAssembly 容器中
- 对每个类型的 Baker 根据使用该 Baker 的类型数量进行降序排序
- BakerDataUtility 被初始化
开始 PreBaking 阶段
获得所有 [WorldSystemFilter(WorldSystemFilterFlags.BakingSystem)] 的系统
依序
创建各个 BakingSystemGroup
- BakingSystemGroup
- PostBakingSystemGroup
- PreBakingSystemGroup
- TransformBakingSystemGroup
将 WorldSystemFilterFlags.BakingSystem 中找到的系统创建到其 UpdateInGroup 特性对应的 group 内,并排序
执行 PreBakingSystemGroup.Update
执行 bakingSystem.Bake
- 为烘焙流程做准备
- 对于全量 Bake
- 清理 Bake 缓存
- 为预制体创建 Entity
- 收集场景中所有 GameObject (_BakeInstructionsCache.CreatedGameObjects / _BakeInstructionsCache.BakeGameObjects) 及其上需要 Bake 的组件 (_BakeInstructionsCache.BakeComponents)
- 对于增量 Bake
- 更新发生变化了的预制体 tracker 信息
- 创建增量烘焙 batch (IncrementalBakingBatch)
- 收集场景中发生变化的 GameObject 及其上发生变化的需要 Bake 的组件 (_BakeInstructionsCache.BakeComponents / _BakeInstructionsCache.RevertComponents)
- 对于全量 Bake
- 执行所有 Baker 的 baker.InvokeBake,并写入一个 EntityCommandBuffer 中。其中部分需要还原的 Entity(?) 状态会被写入一个单独的 EntityCommandBuffer 中,作用尚且不明
- 为烘焙流程做准备
开始 PostBaking 阶段
- 执行 TransformBakingSystemGroup.Update
- 执行 BakingSystemGroup.Update
- 执行 LinkedEntityGroupBaking.Update
- 以 Chunk 为单位为每个转化完毕的 Entity 添加 LinkedEntityGroup
- 从该 Entity 的 LinkedEntityGroupBakingData 中剔除包含了 BakeOnlyEntity 特性的实体(即不会输出到二进制文件),剩余的实体加入 LinkedEntityGroup Buffer
- 执行 PostBakingSystemGroup.Update
结束