Unity DOTS 1.0 (5) Baking System、Baking phases 和 Baking World

Baking System

  • 一个 baking system在处理数据的方式上不同于baker。和baker一个一个处理components不同,它是进行批处理的,并且它可以经由job 和burst 大幅提升处理性能。
  • baking system是在entity创建完成后运行,所以它可以访问到所有初始创建的Entity,包括baker创建的。
  • baking system可以随意改变world,包括创建新的entity。但是在system中创建的entity,不会在场景Bake结束以后销毁;也就是在这个阶段创建的Entity是可以留在我们的世界里面的。
    你也可以来创建entity在多个Baking System之间进行数据传递,如果你希望这个entity在你这个bake场景结束以后有销毁你创建的entity,那么你创建entity就必须要在Baker里面创建,在Baker里面创建的entity(使用CreateAdditionalEntity方法来创建),就会在Baker结束以后销毁

创建一个Baking System

  • 给System做一个特定注解:[WorldSystemFilter(WorldSystemFilterFlags.BakingSystem)] attribute.有了这个注解,Baking 系统就会识别这个System,把它当作Baking System加入到的Baking World里面。

示例代码:给出了代码实现,给所有的有带有组件A的entity加一个tag component,如果一个entity没有组件A,但是又带了tag component,我们就把这个tag component从entity里面删除掉;

public struct AnotherTag : IComponentData { }

        [WorldSystemFilter(WorldSystemFilterFlags.BakingSystem)]
        partial struct AddTagToRotationBakingSystem : ISystem
        {
            public void OnUpdate(ref SystemState state)
            {
            //查找出所有拥有RotationSpeed Component并且没有AnotherTagComponent的Entity
                var queryMissingTag = SystemAPI.QueryBuilder()
                    .WithAll<RotationSpeed>()
                    .WithNone<AnotherTag>()
                    .Build();
				//然后批量添加AnotherTag
                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();
				//然后批量删除AnotherTag
                state.EntityManager.RemoveComponent<AnotherTag>(queryCleanupTag);
            }
        }

这个代码就实现了批量处理Entity。

Baking phases (阶段)

0. 执行PreBakingSystemGroup 分组内容

1. Entity 创建:

  • Unity会先创建出来场景里面的每个GameObject对应的entity, entity只是一个空的容器(internal metadata),没有ComponentData;

2. Baker phase:

  • 对Authoring GameObject做单个单个的转换,转换成ecs entity + component;执行我们每个数据的Bakers,来完成转换;同一种类型的Component转换的时候,使用同一种baker;EntityA, EntityB,但是都有Authoring Component使用同一个Baker;
  • Unity提供的组件数据都是使用系统自带默认的Baker来进行转换;
  • Unity执行Bakers的顺序是不固定的,所以Baker之间的相互依赖是不被允许的。不能在baker A Entity的时候去读取或更改B Entity的Component
  • 只能进行添加组件操作

3. Baking System phase:

  • 所有Baker执行完了后,进入Baking System阶段
  • 对所有的entity 与component来做批量的数据处理,提升性能。
  • 所有的Baking System只能在Baking过程中运行;可以通过注解[UpdateAfter, UpdateBefore, and UpdatelnGroup ]来标记执行顺序;
  • Unity 已经提供了一些默认的分组,按照这样的特定顺序;
    • PreBakingSystemGroup:在Baker之前来调用它分组下面的所有的system(这个组在Baker之前,是个例外);
    • TransformBakingSystemGroup:就在Baker之后,这个分组,可以用来做一些特定的数据转换。
    • BakingSystemGroup: 用户一般编写的所有的Baking System都会被放入到这个分组下。
    • PostBakingSystemGroup:你可以编写Baking System来做结束时候的一些处理。

Baking World

  • 我们每个Authroing Scene在Bake的时候都是独立分来来处理的;
  • 后台每次一个一个场景的来进行Bake处理;
  • 每个subscene,都会有2个World: Conversion world, Shadow worldConversion world。所有的Baker 与Baking System都是运行在它里面。
  • Shadow world:保存了上一次Baking的处理结果,可以通过比较看本次修改了哪些地方;
  • baking完成后,比较两次世界的变化,然后同步到main word(用户可见world)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

找不到mfc140.dll如何解决?mfc140.dll丢失的几种解决方法分享

在我们启动并开始利用电脑进行日常工作的过程中&#xff0c;如果遭遇了操作系统提示“mfc140.dll文件丢失”的错误信息&#xff0c;导致某些应用程序无法正常运行&#xff0c;这究竟是何种情况呢&#xff1f;小编将介绍计算机缺失mfc140.dll文件的5种解决方法&#xff0c;帮助大…

二叉树数据结构详解及java使用二叉树示例代码

二叉树详解&#xff1a; 二叉树是一种常见的树形数据结构&#xff0c;它由节点组成&#xff0c;每个节点最多有两个子节点&#xff0c;分别称为左子节点和右子节点。 二叉树组成&#xff1a; 节点&#xff08;Node&#xff09;&#xff1a; 每个节点包含三个要素&#xff1a;数…

【AI学习】RAG与推荐系统

一、《双塔模型的瓶颈究竟在哪&#xff1f;》 文章介绍了谷歌的一篇论文&#xff0c;《Large Dual Encoders Are Generalizable Retrievers》 文章主要在讲&#xff0c;稠密检索模型在OOD&#xff08;Out-Of-Distribution&#xff0c;即域外&#xff09;泛化能力不行&#xff…

【Pytorch】(十五)模型部署:ONNX和ONNX Runtime

文章目录 &#xff08;十五&#xff09;模型部署&#xff1a;ONNX和ONNX RuntimeONNX 和 ONNX Runtime的关系将PyTorch模型导出为ONNX格式使用Netron可视化ONNX模型图检查ONNX模型验证ONNX Runtime推理结果使用ONNX Runtime运行超分模型 &#xff08;十五&#xff09;模型部署&…

外贸干货|真正的销售高手,都很会提问

你的产品性价比很高&#xff0c;为什么客户没有买单呢&#xff1f; 最重要的原因是你没有了解到他真正的需求。 真正的销售高手&#xff0c;应该是一个提问高手&#xff0c;至少要连续问对方6个问题&#xff0c;问出客户的真实需求。 假如他回答你的问题&#xff0c;你有一种&a…

git 冲突与解决冲突

目录 1.使用 git 解决冲突 GIT 常用命令 制造冲突 解决冲突 2.使用 IDEA 解决冲突 产生冲突 解决冲突 1.使用 git 解决冲突 GIT 常用命令 命令作用git clone克隆git init初始化git add 文件名添加到暂存区git commit -m " 日志信息" 文件名提交到本地库git st…

【运维自动化-配置平台】如何通过模板创建集群和模块

通过【每天掌握一个功能点】配置平台如何创建业务机拓扑&#xff08;集群-模块&#xff09;我们知道了直接创建集群和模块的操作方法&#xff0c;直接创建的方式适合各集群模块都相对独立的场景&#xff0c;那大量的、标准规范的集群模块如何快速创建呢&#xff0c;这里就引入了…

条件生成对抗网络(cGAN)在AI去衣技术中的应用探索

随着深度学习技术的飞速发展&#xff0c;生成对抗网络&#xff08;GAN&#xff09;作为其中的一个重要分支&#xff0c;在图像生成、图像修复等领域展现出了强大的能力。其中&#xff0c;条件生成对抗网络&#xff08;cGAN&#xff09;通过引入条件变量来控制生成模型的输出&am…

面试十五 容器

一、vector容器 template<typename T> class Allocator{ public:T* allocator(size_t size){// 负责内存开辟return (T*)malloc(sizeof(T) * size);}void deallocate(void * p){free(p);}void construct(T*p,const T&val){// 定位newnew (p) T(val);}void destroy(…

Golang对接Ldap(保姆级教程:概念搭建实战)

Golang对接Ldap&#xff08;保姆级教程&#xff1a;概念&搭建&实战&#xff09; 最近项目需要对接客户的LDAP服务&#xff0c;于是趁机好好了解了一下。LDAP实际是一个协议&#xff0c;对应的实现&#xff0c;大家可以理解为一个轻量级数据库。用户查询。比如&#xff…

DiT论文精读Scalable Diffusion Models with Transformers CVPR2023

Scalable Diffusion Models with Transformers CVPR2023 Abstract idea 将UNet架构用Transformer代替。并且分析其可扩展性。 并且实验证明通过增加transformer的宽度和深度&#xff0c;有效降低FID 我们最大的DiT-XL/2模型在classconditional ImageNet 512、512和256、256基…

switch语句深讲

一。功能 1.选择&#xff0c;由case N:完成 2.switch语句本身没有分支功能&#xff0c;分支功能由break完成 二。注意 1.switch语句如果不加break&#xff0c;在一次判断成功后会执行下面全部语句并跳过判断 2.switch的参数必须是整形或者是计算结果为整形的表达式,浮点数会…

centos 7 yum install -y nagios

centos 7 systemctl disable firewalld --now vi /etc/selinux/config SELINUXdisabled yum install -y epel-release httpd nagios yum install -y httpd nagios systemctl enable httpd --now systemctl enable nagios --now 浏览器 IP/nagios 用户名&#xff1a;…

stack,queue的模拟实现以及优先级队列

这篇博客用来记录stack&#xff0c;queue的学习。 stack的模拟实现 stack的模拟实现比较简单&#xff0c;先上代码 #pragma once #include<vector> #include<list> #include<deque> #include<iostream> using std::deque; using namespace std;name…

【STM32HAL库】外部中断

目录 一、中断简介 二、NVIC 1.寄存器 2.工作原理 3.优先级 4.使用NVIC 三、EXTI 1.简介 2.AFIO&#xff1a;复用功能IO&#xff0c;主要用于重映射和外部中断映射配置​编辑 3. 中断使用 4.HAL库配置使用 一、中断简介 中断的意义&#xff1a;高效处理紧急程序&#xff0c;不会…

树莓派学习笔记--串口通信(配置硬件串口进行通信)

树莓派串口知识点 树莓派4b的外设一共包含两个串口&#xff1a;硬件串口&#xff08;/dev/ttyAMA0&#xff09;,mini串口&#xff08;/dev/ttyS0&#xff09; 硬件串口由硬件实现&#xff0c;有单独的波特率时钟源&#xff0c;性能高&#xff0c;可靠&#xff1b;而mini串口性能…

Java-AQS的原理

文章目录 基本概述1. 设计思想2. 基本实现 一些关键词语以及常用术语&#xff0c;主要如下&#xff1a; 信号量(Semaphore): 是在多线程环境下使用的一种设施&#xff0c;是可以用来保证两个或多个关键代码段不被并发调用&#xff0c;也是作系统用来解决并发中的互斥和同步问题…

数据挖掘 | Count数据去除批次效应后不是整数甚至还出现负值导致无法进行差异分析怎么办?

之前咱们介绍过数据挖掘 | 批次效应的鉴定与处理 | 附完整代码 注释 | 看完不会来揍我&#xff0c;但是很多小伙伴遇到了Count数据批次处理后不是整数甚至还出现负值的问题&#xff0c;这就导致无法使用某些包包进行差异分析&#xff08;对差异分析感兴趣的小伙伴可以查看&…

MySQL中如何随机获取一条记录

点击上方蓝字关注我 随机获取一条记录是在数据库查询中常见的需求&#xff0c;特别在需要展示随机内容或者随机推荐的场景下。在 MySQL 中&#xff0c;有多种方法可以实现随机获取一条记录&#xff0c;每种方法都有其适用的情况和性能特点。在本文中&#xff0c;我们将探讨几种…

word添加行号

打开页面设置&#xff0c;找到行号
最新文章