好让我们看看到底什么是烘焙吧
Baking概述
Baking是将场景中的GameObject数据转换变成EntityScene相关数据的过程。
Baking是不可逆的,将性能没有那么好的GamoObject,转化成Entity+Cpmponent的数据
目的是以最有效的方式表示应用程序中的数据,以避免处理任何不需要的数据。由于这种设计,它将创作和运行时数据分开。
Authoring data:创作数据,在你编辑的时候用到的数据,例如脚本、模型或任何其他与游戏相关的数据。
Runtime data:运行数据,在项目启动后使用的数据,这些针对性能和存储效率进行了优化:专为计算机处理而设计。
Baking阶段
烘焙分为四个阶段
- EntityBake:烘焙生成Entity;
- PreBakingSystemGroup:这个在烘焙Compnent之前执行
- Baker:烘焙生成各个Entity下的Component;
- BakingSystemGroup:通过System批量处理已经生成的Componet.
- PostBakingSystemGroup:最后执行的BackingSystem.
因为baker本身是无序的,所以在baker时不能依赖其他baker生成的Component数据
bakingSystem
要说BakingSystem,首先要说System,System是ECS里的最后一个-处理逻辑
partial struct AddTagToRotationBakingSystem : ISystem
{
public void OnUpdate(ref SystemState state)
{
}
}
System需要继承ISystem类,并且重写 OnUpdate方法
这个方法会自动每帧调用。
而bakingSystem则需要在类前添加声明
[WorldSystemFilter(WorldSystemFilterFlags.BakingSystem)]
partial struct AddTagToRotationBakingSystem : ISystem
这个声明会让这个System在baking时候调用。
public void OnUpdate(ref SystemState state)
{
//获取到所有有RotationSpeedComponent并且没有AnotherTag的数据
var queryMissingTag = SystemAPI.QueryBuilder()
.WithAll<RotationSpeed>()
.WithNone<AnotherTag>()
.Build();
//为这些数据添加AnotherTag Component
state.EntityManager.AddComponent<AnotherTag>(queryMissingTag);
}
在baking过程中的 BakingSystemGroup 会调用对应system的OnUpdate,这个时候已经走了Baker的流程,我们可以取到对应的Component去进行修改添加等操作。
如果想要添加PostBakingSystemGroup的话
需要继承类ComponentSystemGroup
partial class AddTagToRotationBakingSystem :ComponentSystemGroup
{
public void OnUpdate(ref SystemState state)
{
}
}
BakingScene
Baking是发生在subScene中的,是一个异步执行的过程,为了达成增量烘焙的条件,他设计了两个World
- Conversion world 转换世界 实时根据场景中的修改进行烘焙
- Shadow world 阴影世界 保存上一次的烘焙结果
这样可以通过比对两个world的不同处进行增量烘焙。
baking后面还有些内容,我们下次再聊