【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。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用ResponseEntity自定义Headers的方法如下: 首先,创建一个HttpHeaders对象来设置自定义的Headers。可以使用add()方法来添加具体的Header键值对。例如,可以使用set()方法来设置一个键值对。 然后,创建一个ResponseEntity对象并将要返回的响应体和自定义的Headers传入。可以使用ok()方法来创建一个成功的ResponseEntity对象。 最后,在Controller方法中,将ResponseEntity对象作为返回值返回即可。 下面是一个示例代码: ```java import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class MyController { @GetMapping("/customHeaders") public ResponseEntity<String> getResponseWithCustomHeaders() { // 创建自定义的Headers HttpHeaders headers = new HttpHeaders(); headers.add("Custom-Header", "Custom Value"); headers.set("Another-Header", "Another Value"); // 创建ResponseEntity对象并设置自定义Headers ResponseEntity<String> responseEntity = ResponseEntity.ok() .headers(headers) .body("Response Body"); return responseEntity; } } ``` 在上述示例中,通过访问`/customHeaders`路径,将返回一个带有自定义Headers的ResponseEntity对象。其中,自定义Headers包括"Custom-Header"和"Another-Header"两个键值对。 请注意,在使用ResponseEntity时,需要在Controller方法中返回ResponseEntity对象,而不是直接返回响应体内容。通过设置ResponseEntity对象的headers属性来设置自定义Headers。在Spring框架中,可以使用ResponseEntity对象来设置响应头信息。 : 需要注意的是,在使用ResponseEntity时,需要在Controller方法中返回ResponseEntity对象,而不是直接返回响应体内容。 : 在Spring框架中,可以使用ResponseEntity对象来设置响应头信息。可以通过以下代码设置响应头:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值