首页 > 其他分享 >Unity DOTS Baking System与Baking World

Unity DOTS Baking System与Baking World

时间:2023-12-01 11:15:56浏览次数:43  
标签:DOTS Baking Baker System entity Unity World

最近DOTS终于发布了正式的版本, 我们来分享一下DOTS里面Baking阶段,Baking System,Baking World的关键概念,方便大家上手学习掌握Unity DOTS开发。Unity在Baking也是基于ECS模式开发设计的,所以Baking的时候也会有Baking System与Baking World,把Baking出来的数据放到Baking World里面。

对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习。

Baking 的主要阶段

在Baker阶段执行之前,Unity会把subscene中所有的Authoring GameObject创建出对应的entity,这个阶段entity不包含任何组件数据,只包含一些metadata的描述数据。创建完Entity以后,就会执行Bakers 每个Baker处理对应它的authoring component的数据转化。每种类型的数据对应一种Baker,例如Entities Graphics就会有Baker将GameObject的渲染数据转换成renderers的数据。Unity Physics有Baker 把刚体RigidBody组件转成ecs数据。相同的类型只要一种Baker就即可。

Unity在运行Baker转换的时候,无法保证执行Baker的顺序, Baker不存在依赖关系。因此Baker不能去读取与改变entity中的组件数据,只能创建新的组件到entity。

PreBakingSystemGroup: 这个System分组执行发生在所有Bakers运行之前;

TransformBakingSystemGroup: 是一个用于处理实体的变换信息的系统组。它负责将实体的Transform数据进行烘焙,以提高性能和优化渲染。

实时Baking时,Unity会运行所有的baking system分组,它会把entity数据存入到entity scene,并序列化到磁盘。并把烘培出来后变化的数据同步到main ECS World里面。

Baking World

Unity 在Baker 每个entity scene的时候都是独立的。每次只处理一个场景。同时每个独立的场景都有一个独立的main world。同时在Baker每个场景的时候,我们的Unity会额外分配两个世界:

Unity 会在 Conversion world 里面来运行Baker与Baking Sytems来做场景物体的Baking。当Baking结束以后,Unity Baking比较Shadow World与Conversion World的变化,看哪些改变了,Unity只把本次改变同步给main World。

Baking System

Baking System 是一种机制,被用于批量处理ecs components与entities的数据。一个Baking System在Unity DOTS内部也是一个System,它基于多线程与Burst 编译器,能够很好做批量的处理。Baking System与Baker机制不同的点在于Baker是将authoring data一个一个的处理转换,然后Baking System用户成批的处理已经转换好的ecs components与entities。所以Baking这个过程在执行Baking System 之前,必须要把要先执行让Baker把所有的entity 都初始化创建出来以后,才能只能执行Baking System, 批量处理。在Baking System中你可以改变当前

创建一个Baking System,我们需要给Baking System加上[WorldSystemFilter(WorldSystemFilterFlags.BakingSystem)]的注解。加了这个注解,我们系统Baker处理就会把它识别出来,并把它加入到Baking World里面来进行迭代。Unity每次Baking,都会迭代World里面的所有Baking System。接下来我们看一个Baking System 添加一个tag component到包含的某A组件的entity中的示例代码:

public struct AnotherTag : IComponentData { }

[WorldSystemFilter(WorldSystemFilterFlags.BakingSystem)]

partial struct AddTagToRotationBakingSystem : ISystem

{

public void OnUpdate(ref SystemState state)

{

var queryMissingTag = SystemAPI.QueryBuilder()

.WithAll<RotationSpeed>()

.WithNone<AnotherTag>()

.Build();

state.EntityManager.AddComponent<AnotherTag>(queryMissingTag);

// Omitting the second part of this function would lead to inconsistent

// results during live baking. Added tags would remain on the entity even

// after removing the RotationSpeed component.

var queryCleanupTag = SystemAPI.QueryBuilder()

.WithAll<AnotherTag>()

.WithNone<RotationSpeed>()

.Build();

state.EntityManager.RemoveComponent<AnotherTag>(queryCleanupTag);

}

}

定义了一个Baking System, 每次迭代update的时候,找出World中所有包含RotationSpeed组件并且不含AnotherTag组件的Entity的集合,给它们加上AnotherTag组件,找出所有不包含RotationSpeed且包含AnotherTag的Entity集合,把它们的AnotherTag删除掉。

今天的Baking Phase, Baking World与Baking System就分享到这里了,关注我学习更多的最新Unity DOTS开发技巧。

标签:DOTS,Baking,Baker,System,entity,Unity,World
From: https://www.cnblogs.com/bycw/p/17869256.html

相关文章

  • Unity DOTS System与SystemGroup概述
    最近DOTS终于发布了正式的版本,我们来分享以下DOTS里面System关键概念,方便大家上手学习掌握UnityDOTS开发。System是迭代计算与处理World中的Entity实体的ComponentData数据的逻辑代码。System对应的代码是运行在mainthread上的。World里面所有的System通过SystemGroup来进行......
  • Unity 最新DOTS系列之《Baking与Baker的详解》
    UnityDOTSBaking与Baker详解UnityDOTSBaking与Baker详解最近DOTS终于发布了正式的版本,我们来分享一下DOTS里面Baking与Baker的关键概念,方便大家上手学习掌握UnityDOTS开发。UnityDOTS开发模式,为了让大家在”创作”游戏的时候使用原来组件方式来编辑游戏场景与资源,同......
  • Beyond Hello World, A Computer Vision Example
    BeyondHelloWorld,AComputerVisionExampledlaicourse/Course1-Part4-Lesson2-Notebook.ipynbatmaster·lmoroney/dlaicourse(github.com)StartCoding导入TensorFlowimporttensorflowastfprint(tf.__version__)从tf.keras数据集API中获取时尚......
  • Unity DOTS Component概述
    最近DOTS终于发布了正式的版本,我们来分享以下DOTS里面地几个关键概念,方便大家上手学习掌握UnityDOTS开发。UnityDOTS中Entity作为实体不直接去存放数据,而是将数据以一个个的组件为载体来存放起来。每个Entity会得到一些不同的ComponentData的组合,这些组合代表着不同的Entity......
  • Unity DOTS World Entity ArchType Component EntityManager System概述
    最近DOTS终于发布了正式的版本,我们来分享以下DOTS里面地几个关键概念,方便大家上手学习掌握UnityDOTS开发。UnityDOTS中所有的Entities都是被放到World世界中。每个Entity在它所在的World里面有唯一不同的ID号来区分。DOTS项目中可以同时有多个World。每个World有一个Entity......
  • The Hello World of Deep Learning with Neural Networks
    TheHelloWorldofDeepLearningwithNeuralNetworksdlaicourse/Course1-Part2-Lesson2-Notebook.ipynbatmaster·lmoroney/dlaicourse(github.com)编写这样一个函数的代码:floathw_function(floatx){floaty=(2*x)-1;returny;}Impor......
  • Day04:编写第一个代码“Hello World!”
    HelloWorld随便新建一个文件夹,存放代码新建一个java文件文件后缀名为.javaHello.java[注意点]系统显示后缀名编写代码publicclassHello{ publicstaticvoidmain(String[]args){ System.out.print("Hello,World!"); }}java文件路径前加CMD运行,打开控制......
  • hello-world
    title:HelloWorldindex_img:https://proxy.thisis.plus/favicon.icobanner_img:https://proxy.thisis.plus/background.pngdate:2020-1-2010:00:00hide:trueWelcometoHexo!Thisisyourveryfirstpost.Checkdocumentationformoreinfo.Ifyougetany......
  • Top 10 Strong Earthquakes in the World
    ChileEarthquake(M=9.5)in1960inminutesputmore2millionspeopleinlostliveorhomesAlaskaEarthquake(M=9.2)in1964RussianEarthquake(M=9.0)in1952JapanEarthquake(M=9.0)in2011,2000peoplediedinminutesIndonesianEarthquake......
  • JavaFx helloworld 坑
    系统LinuxMintIDEA创建的helloworld项目,用IDEA运行就僵住,然而用mvncleanjavafx:run却能成功————在系统terminal能成功,在IDEA的Terminal不行。不过我也是见怪不怪了,上次Jetbrains家的Rider运行Avalonia能出窗口,但是窗口是花的,到Avalonia报了issue,......