Unity DOTS1.0(4) Baking 和 Baker

Baking

概念:

  1. 把Editor中的GameObject数据转换成entities数据写入到Entity Scens里面,这个过程我们叫做Baking
  2. Baking是一种不可逆的操作,把低效代价昂贵的但是灵活的GameObjects转换成性能高效的Entities与Components。

作用:

  1. 在传统的模式下,开发者使用的GameObject机制进行创作,然后运行也是基于它的. 通过baking,能让用户在ecs模式下,创作的时候使用还是使用GameObject机制来创作,增加易用性。
  2. Unity通过Baking的方式,把GameObject数据Authoring Data(创作数据)在编译时就转换为Runtime Data(运行数据),这样在运行的时候就可以直接使用运行数据

处理过程

  • 在ECS模式下,传统的GameObject,称为Authoring GameObject, Authoring GameObject上的Component 称为: Authoring Component

  • Authoring Scenes:传统的GameObject所在场景叫做authoring scene,用来将传统GameObject数据转换成ECS模式下的数据所在的场景(场所);

  • Baking 转换发生的过程只会在编辑器的模式下,在运行前先转好ecs数据,然后运行的时候直接使用ecs数据; 无论什么时候,只要我们Authoring Scene中的Authoring GameObject被改变了,就会触发我们Baking; Authoring Scene必须要必须要作为subscene加载进来时,创作Scene才会执行baking;

    • 会baking:
      会触发baking
    • 不会baking
      不会触发baking

baking的两种模式:

  • Full baking(全baking): Unity整个Authoring Scene 全部bake成entities scene;

    • 触发条件:
      1:在我们的disk上,找不到转换好的entities scene的数据;
      2:我们的Authoring Scene被修改了,同时entity scene,已经过期了;
      3:当修改了Baker代码的时候,BakingVersion,注解的时候,会引发full baking;
      4: A[BakingVersion] attribute注解的Baking代码被修改了,会引发full baking.
      5: Project Setting设置里面与Entities相关的设置被修改了,会导致引发fullbaking;
      6:如果你在subscene节点的属性检查器里面点击了reimport按钮,那么这个时候会导致full baking;
      7:如果你清理了Baking Cache,也会导致我们的full baking;
    • Full Baking会把我们的输出数据存放到我们的磁盘disk上(一些文件文件),你编辑器或运行的时候需要使用,就去加载
  • lncremental baking(增量baking):只bake改变的数据;

    • 当作为subscene来加载创作场景的同时我们也创建与初始化了Incremental baking;
    • 在创作编辑的时候,可以在ECS的数据里面直接体现出实时编辑与修改的结果;
    • 增量Baking只会发生在我们的内存里面,不会同步到我们的disk;
    • 当编辑场景数据的时候,会把改变的baking到内存里面,所以ECS就可以直接使用编辑好的数据。同时只baking改变的数据,所以速度非常快;
  • 注意: lncremental Baking 和Full baking输出是不同的,就会导致entity的顺序不同,内存大小不同,chunk的排布可能也不同。所以为了避免一些可能的未知错误,需要使用Reimport来强制进行full baking
    在这里插入图片描述

Baker运作机制

  • 一个Baker就是Baking 的其中的一个执行者,负责把某个Authoring Data转成ecs data;
  • 要定义一个Baker,首先要定一个托管类:继承Baker,T指的是要转换的Authoring Component的类型;
  • 当Baking的时候只要遇到这种类型的Authoring Component,就会找到这个Baker,然后调用这个Baker方法,并把要转的组件数据对象作为参数,输入进来;
  • 代码示例:
// IComponentData是一个空接口,只是用来标记这个类是一个ComponentData
// 这是unmanaged 类型,不会被GC管理, 内部只能使用unmanaged的数据类型
struct ComponentData : IComponentData
{public float rotSpeed;
}public class ComponentAuthoring : MonoBehaviour
{public float rotateSpeed = 90f;
}// 自定义一个Baker,方便我们场景在Bake的时候,来转这个组件数据
public class MyComponentBaker : Baker<ComponentAuthoring>
{// subscene bake时调用的方法 编译时就调用public override void Bake(ComponentAuthoring authoring){// 获取到对应的Entityvar entity = GetEntity(TransformUsageFlags.Dynamic);// 这里只是数据传递,并不是Entity中通过Archetype分配出来的内存var data = new ComponentData(){// authoring是我们在场景中设置的值// ECS 中使用的数学库是Unity.Mathematics!rotSpeed = math.radians(authoring.rotateSpeed)};// 将数据添加到Entity中AddComponent(entity, data);}
}
  • 对于其他Unity自带的Component(例如 Collider这些),Unity已经提供了写好了的Baker。
  • Full Baking,Authoring Scene 里面所有组件的Baker都会被调用一次;lncremental Baking:那么只有修改的组件才会被Baker一次;

在baker中访问其他来源数据

为了保证lncremental Baking的正常工作,Unity会自动跟踪我们的Authoring Component中的数据成员,当数据成员改变了,就会调用Baker的bake方法,让他重新执行;但是Unity不会跟踪这个转换依赖的其它的数据资源, 所以需要在Baker方法里面添加依赖关系,系统才可以追踪依赖的变化。

  • 代码示例:
public class DependentDataAuthoring : MonoBehaviour{public GameObject Other;public Mesh Mesh;}public class GetComponentBaker : Baker<DependentDataAuthoring>{public override void Bake(DependentDataAuthoring authoring){// Before any early out, declare a dependency towards the external references.// Because even if those evaluate to null, they might still be a proper Unity// reference to a missing object. The dependency ensures that the baker will// be triggered when those objects are restored.DependsOn(authoring.Other);DependsOn(authoring.Mesh);if (authoring.Other == null) return;if (authoring.Mesh == null) return;var transform = GetComponent<Transform>();var transformOther = GetComponent<Transform>(authoring.Other);

使用DependOn方法声明依赖项,这样当Other或者Mesh变化时,这个GameObject也会被Baking

**注意:**这里的GetComponent并不是原来意义上的GetComponent. 它在调用时内部也会注册依赖关系, 即使一开始对象上没有GetComponent获取的组件(baking时返回为空) 当重新获得这个组件的时候也会再一次触发这个Baker

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/815472.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MyBatis批量插入的五种方式

MyBatis批量插入的五种方式: 一、准备工作 1、导入pom.xml依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- MySQL驱动依赖 --…

vue3 依赖-组件tablepage-vue3说明文档,列表页快速开发,使用思路及范例(Ⅱ)搜索及数据获取配置项

github求⭐ vue3 依赖-组件tablepage-vue3说明文档&#xff0c;列表页快速开发&#xff0c;使用思路及范例&#xff08;Ⅰ&#xff09;配置项文档 vue3 依赖-组件tablepage-vue3说明文档&#xff0c;列表页快速开发&#xff0c;使用思路及范例&#xff08;Ⅱ&#xff09;搜索…

什么是享元模式,有哪些具体应用

一、定义 享元模式是一种通过尽可能多地共享数据来最小化内存使用和对象数量&#xff0c;从而提高性能的设计模式。在享元模式中&#xff0c;如果需要相同数据的多个对象&#xff0c;则共享这些对象而不是创建新的对象&#xff0c;从而提高系统的效率。 其实有很多应用场景&am…

数据库(1)

目录 1.什么是事务&#xff1f;事务的基本特性ACID&#xff1f; 2.数据库中并发一致性问题&#xff1f; 3.数据的隔离等级&#xff1f; 4.ACID靠什么保证的呢&#xff1f; 5.SQL优化的实践经验&#xff1f; 1.什么是事务&#xff1f;事务的基本特性ACID&#xff1f; 事务指…

Alibaba --- 如何写好 Prompt ?

如何写好 Prompt 提示工程&#xff08;Prompt Engineering&#xff09;是一项通过优化提示词&#xff08;Prompt&#xff09;和生成策略&#xff0c;从而获得更好的模型返回结果的工程技术。总体而言&#xff0c;其实现逻辑如下&#xff1a; &#xff08;注&#xff1a;示例图…

napi系列学习进阶篇——NAPI异步调用

简介 OpenHarmony Napi 标准系统异步接口实现支持Callback方式和Promise方式。标准系统异步接口实现规范要求&#xff0c;若引擎开启Promise特性支持&#xff0c;则异步方法必须同时支持Callback方式和Promise方式。使用哪种方式由应用开发者决定&#xff0c;通过是否传递Call…

SpringMVC--获取请求参数 / 域对象共享数据

目录 1. SpringMVC 获取请求参数 1.1. 通过ServletAPI获取 1.2. 控制器方法形参获取 1.3. RequestParam 1.4. RequestHeader 1.5. CookieValue 1.6. 通过POJO获取请求参数 1.7. 解决获取请求参数的乱码问题 2. 域对象共享数据 2.1. 三大域对象 2.2. 准备工作 2.3. S…

RedisTemplate对象中方法的使用

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 Redis是一个key-va…

第二届数据安全大赛暨首届“数信杯”数据安全大赛数据安全积分争夺赛-东区预赛wp

附件下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1tClZrup28n4fUe5Kpa7mgQ?pwdkbd6 文章目录 数据安全题re_ds001Homooo0 数据分析题数据分析1-1数据分析1-2数据分析1-3数据分析2-1数据分析2-2数据分析2-3数据分析3-1数据分析3-2数据分析3-3数据分析5-1数据…

【AI基本模型】简化生成对抗网络 (GAN)

目录 一、说明 二、GAN的工作 三、如何手动计算生成对抗网络&#xff08;GAN&#xff09;&#xff1f;✍️ 四、GAN的应用 一、说明 生成对抗网络 &#xff08;GAN&#xff09; 是一种机器学习算法&#xff0c;可以生成与现实世界数据几乎无法区分的合成数据。它们的工作原理是…

【计算机毕业设计】基于Java+SSM的实战开发项目150套(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f9e1;今天给大家分享150的Java毕业设计&#xff0c;基于ssm框架&#xff0c;这些项目都经过精心挑选&#xff0c;涵盖了不同的实战主题和用例&#xff0c;可做毕业设计和课程…

python画神经网络图

代码1(画神经网络连接图&#xff09; from math import cos, sin, atan import matplotlib.pyplot as plt # 注意这里并没有用到这个networkx这个库&#xff0c;完全是根据matploblib这个库来画的。 class Neuron():def __init__(self, x, y,radius,nameNone):self.x xself.y …

文本检索粗读

一.前情提要 1.本文理论为主&#xff0c;并且仅为个人理解&#xff0c;能力一般&#xff0c;不喜勿喷 2.本文理论知识较为散碎 3.如有需要&#xff0c;以下是原文&#xff0c;更为完备 Neural Corpus Indexer 文档检索【论文精读47】_哔哩哔哩_bilibili 二.正文 &#xf…

CommunityToolkit.Mvvm笔记1---Instruction

CommunityToolkit.Mvvm是一个官方社区套件(Windows Community Toolkit)&#xff0c;延续了MVVMLight的风格&#xff0c;是一个现代、快速和模块化的 MVVM 库。 它是 .NET 社区工具包的一部分。 第一&#xff1a;入门安装 1&#xff0c;用NuGget安装&#xff0c;搜索Community…

【菜狗学前端】ES6+笔记(包含Promise及async、await等)

老样子。复制上来的图片都没了&#xff0c;想看原版可以移步对应资源下载(资源刚上传&#xff0c;还在审核中) &#xff08;免费&#xff09;菜狗学前端之ES6笔记https://download.csdn.net/download/m0_58355897/89135424 一 解构赋值 解构赋值 解构指的是把一个数据…

马上拥有“钞能力”!!24个Python接单平台,赶紧码住!!

学Python能兼职挣米吗&#xff1f;怎么挣&#xff1f; 一、Python兼职种类&#xff1a; 接私活刚学会python那会&#xff0c;就有认识的朋友介绍做一个网站的私活&#xff0c;当时接单赚了4K&#xff0c;后又自己接过开发网站后台接口、做数据处理等事情&#xff0c;都赚了一…

【机器学习300问】66、均方误差与交叉熵误差,两种损失函数的区别?

一、均方误差&#xff08;Mean Squared Error, MSE&#xff09; 假设你是一个教练&#xff0c;在指导学生射箭。每次射箭后&#xff0c;你可以测量子弹的落点距离靶心的差距&#xff08;误差&#xff09;。MSE就像是计算所以射击误差的平方后的平均值。它强调了每一次偏离靶心的…

了解 Vue 工程化开发中的组件通信

目录 1. 组件通信语法 1.1. 什么是组件通信&#xff1f; 1.2. 为什么要使用组件通信&#xff1f; 1.3. 组件之间有哪些关系&#xff08;组件关系分类&#xff09;&#xff1f; 1.4. 组件通信方案有哪几类 &#xff1f; 2. 父子通信流程图 3. 父传子 3.1. 父传子核心流程…

力扣练习题(2024/4/14)

1接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,3,2…

SpringBoot 整合RocketMQ

目录 一、引入依赖 二、配置文件 三、生产者 四、消费者 五、结果 一、引入依赖 <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.2.0</version> </d…