【UnityDOTS 九】Entity Command Buffer使用

Entity Command Buffer使用

前言

直接的创建,销毁Entity,以及对Entity的结构进行更改(比如增加删除Component)都要通过EntityManager等接口来实现。
在Job中,只能实现对Entity的Component组件进行数据修改的功能。
我们对Entity的修改只能在主线程上进行。
在Job中需要通过Entity Command Buffer实现对Entity修改操作的记录;然后回到主线程进行统一操作。

一、Entity Command Buffer是什么?

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
在主线程上创建一个ECB对象,传递到Job中,然后在Job中进行对应的操作记录后,在主线程进行回放操作。
ECB可以看做类似在Job中使用的EntityManager,但是因为实际操作还是在主线程,所以有一定的规则进行约束。

二、Entity Command Buffer创建

ECB对象的创建,需要在Job中使用时,需要传入Allocator.TempJob,或Allocator.Persistent。因为它的生命周期不只是当前函数或者当前帧,是需要传入到Job中使用的。

EntityCommandBuffer ecb = new EntityCommandBuffer(Allocator.TempJob);

ECB如果要在多个并行的Job中使用,需要转换成ParalleWriter,再传入到Job中使用。
在这里插入图片描述

三、Entity Command Buffer使用

ECB的playBack方法需要在主线程调用(一般在System中),所以要保证使用ECB去记录修改的Job需要在调用playBack方法之前调用完毕。
在playBack之后,类似NativeArrary一样,需要手动去销毁。所以一般的使用流程:

  • 依赖的Job的handle上调用Complete让主线程等待完成
  • 调用ECB.PlayBack,去回放操作
  • 调用ECB.Dispose,去销毁ECB内存

利用JOB去创建Entity时,所以Job无法继承IJobEntity以及IJobChunk来实现。需要利用IJob,IJobFor,IJobParallelFor这些基础Job接口来实现多线程。

注意点:
1.在Job中使用ECB时,无法对创建出的临时Entity进行SetComponent操作,因为Job创建的Entity只是临时的,实际回放时,才会创建真正的Entity。只能给Entity进行AddComponent操作。需要用其他的System在创建完这些Entity的System之后,再来操作这些Entity的Component来实现设置数据。
2.也不能在ECB回放的主线程上,对拿到的Entity集合进行操作。
3.ParalleWriter在写入时为了保证回放的顺序,内部使用了EntityIndexInQuery
在这里插入图片描述
4.最好每个单独的JOB使用独立的ECB,避免出现各类问题。
5.ECB的PlayBack方法,最好只调用一次。多次调用可能会出问题,如果要多次调用可以参考PlaybackPolicy.MutiPlayback选项。

四、Entity Command Buffer System

可以自定义Entity Command Buffer System,来使用ECB,在这个System中创建的ECB放到Job中使用时,需要注意依赖问题,同时不需要手动Playback,以及手动dispse ECB。
DOTS中会默认创建一些ECB System来提供我们使用,一般情况,不需要自定义ECB System。
可以通过代码获取这些阶段的ECB来依赖这些默认ECBSystem的回放流程,完成我们的回放操作。比如BeginInitializationEntityCommandBufferSystem中的,它会在下一帧进行回放操作。这样我们就不需要自己去管理回放了。

总结

Entity Command Buffer主要用于在Job中创建,销毁Entity,对Entity的Component的增加,删除。但无法实现对创建的Entity来setComponent。

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

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

相关文章

PHP+MySQL:查询所有表格信息

效果 代码 $sql "SHOW TABLES"; $sql "SHOW TABLES"; $result DB_query($sql, $db); $myrow DB_fetch_array($result) echo <td> <a href" . $RootPath . /table_detial.php?table_name . $myrow[0] . "> . $myrow[0] . …

mysql 联合查询

mysql联合查询 联合查询&#xff1a;union&#xff0c;将多次查询(多条select语句)的结果&#xff0c;在字段数相同的情况下&#xff0c;在记录的层次上进行拼接。 基本语法 联合查询由多条select语句构成&#xff0c;每条select语句获取的字段数相同&#xff0c;但与字段类…

【花雕】全国青少年机器人技术一级考试备考实操搭建手册7

随着科技的不断进步&#xff0c;机器人技术已经成为了一个重要的领域。在这个领域中&#xff0c;机械结构是机器人设计中至关重要的一部分&#xff0c;它决定了机器人的形态、运动方式和工作效率。对于青少年机器人爱好者来说&#xff0c;了解机械结构的基础知识&#xff0c;掌…

量子 能源,节能减排还是另有“端倪”?

光子盒研究院 前言&#xff1a;如今&#xff0c;量子技术早已走出实验室、广泛赋能电力、化学、医学等各个领域&#xff1b;创新赛道上&#xff0c;加速奔跑的量子产业&#xff0c;将带来无限可能。现在&#xff0c;光子盒特开启「量子」专栏&#xff0c;解读量子技术将为下游应…

(六)python实战——使用Redis库完成redis基本数据类型数据的操作案例

前言 本节内容主要介绍一下在python环境下&#xff0c;使用Redis库实现redis基本数据类型String、List、Set、Zset、Hash等数据的操作&#xff0c;通过案例的演示&#xff0c;学习python环境下&#xff0c;redis缓存数据库的基本使用和操作。 正文 ①使用pip命令安装Redis依…

资源释放的方式

资源释放通常指的是关闭文件、网络连接、数据库连接等资源&#xff0c;以释放系统资源并防止资源泄漏。 1&#xff1a;try-catch-finally finally:在异常处理时提供finally块来执行所有清除操作&#xff0c;比如IO流中的释放资源特点&#xff1a;被finally控制的语句最终一定…

Visual Studio Code系列--CMake Tools使用说明

一、目的 在linux系统上开发程序&#xff0c;一般都是使用vimgccgdb进行的&#xff1b;但是为了开发效率我们也会使用Visual Studio Code进行开发&#xff0c;毕竟有界面的开发调试还是更加友好一些。 老牌程序员肯定都知道make构建工具&#xff0c;但是其晦涩的语法还是难住不…

超实用攻略!GPT能玩的这么6,你居然还不知道?

开篇 自古以来,智者皆知学无止境,而在我们身边,正有一款奠基于这个原则的AI机器人—ChatGPT,他擅长从网络上学习各种知识,然后把这些知识用在他的对话中。没错,它就是天马行空的闲话家,无所不谈的取经者。可你知道怎样让它更加符合你的使用需求,适应你的工作节奏么?哦…

中国汽车协会:我国整车出口数量达到43.8万辆,同比增长92.8%

根据中国汽车工业协会发布的数据&#xff0c;今年5月份我国汽车整车出口量达到43.8万辆&#xff0c;较上月增长3.2%&#xff0c;同比增长92.8%。 同时&#xff0c;整车出口金额环比增长8.8%&#xff0c;同比增长1.2倍。而今年1-5月&#xff0c;汽车整车出口量达到193.3万辆&…

vue vant Calendar日历定制

calendar文档 <template> ...<Calendar :min-date"start" :max-date"end":title"null" :show-mark"false" :show-subtitle"false" :show-confirm"false" :show-title"true":poppable"fa…

NextJs下浅尝Prisma+Sqlite+逆向生成数据模型

1.安装prisma npm install prisma/client 2.创建schema.prisma npx prisma init 执行完命令后创建文件目录如下&#xff1a; 3.配置数据库连接 generator client {provider "prisma-client-js" }datasource db {provider "sqlite" //数据库类型 这…

大模型入局传统算法,LLMZip基于LLaMA-7B实现1MB文本压缩率90%!

论文链接&#xff1a; https://arxiv.org/abs/2306.04050 随着以ChatGPT、GPT-4为代表的AI大模型逐渐爆火进入公众视野&#xff0c;各行各业都开始思考如何更好的使用和发展自己的大模型&#xff0c;有一些评论甚至认为大模型是以人工智能为标志的第四次产业革命的核心竞争产品…