work节点使用外部包_unity DOTS中的JobComponentSystem使用介绍

跳转至专题目录

专题推荐文章:

  1. 温故知新——RectTransform成员属性的再认识
  2. unity Scene View扩展之编辑器扩展总结
  3. Unity获取鼠标点击ui GameObject

本系列目录

  1. DotsSample笔记
  2. Dots代码阅读笔记——IConvertGameObjectToEntity的一生
  3. Dots代码阅读笔记——ConvertToEntity的一生
  4. Dots代码阅读笔记——IConvertGameObjectToEntity的一生 (图解)
  5. IConvertGameObjectToEntity,ConvertToEntity,GameObjectEntity三者之间的关系和区别
  6. Dots代码阅读笔记—GenerateAuthoringComponentAttribute的一生
  7. 转Entity的接口那么多,那么从资源加载的GameObject到底怎么转Entity?
  8. Unity2019.3 DOTS代码简化笔记
  9. unity DOTS中的JobComponentSystem使用介绍

一、Entities.ForEach()参数介绍

  1. Entities.ForEach()表示,包含参数中的组件的Entity,可以对它进行操作
  2. 参数添加ref,表示需要修改IComponentData数据
  3. 参数添加in,表示只读IComponentData,
  4. ref参数在前面,in参数在后面,可提升Job运行效率。
  5. 如果所操作的Entity需要包含某个IComponentData,但是不需要读,不需要写,可以添加一个WithAll<T>(),表示操作的Entity需要包含T组件(见图1.2)

093e3c491325d3c9afa79bd15f35386e.png
图1.1 ref 可写,in只读,前面ref,后面in,提可写高效率

7d70a8aba7514c998c2aff2539b8b1c0.png
图1.2 包含BallTag

二、Entities.ForEach()怎么对Entity操作?

如果需要改变Entity结构,加组件,删组件,删Entity时,怎么操作呢?

Entities.ForEach()第一个参数为Entity类型,然后可以在下面两种方法中选一种。

  1. Entities.WithStructuralChanges(),该方法表示Entities.ForEach()中Entity会被进行修改,具体修改方法使用EntityManager中的接口(见图2.1)
  2. EnittyCommandBuffer,将EntityManager改为EnittyCommandBuffer,然后在Entities.ForEach()外部进行PlayBack即可,不过注意需要Dipose()掉该buffer(见图2.2)

252fb4d196da1836148f83fa4c26b420.png
图2.1 当需要改变Entity结构,加组件,删组件,删Entity

018948cae74968d52b58d38e82f3f166.png
EntityCommandBuffer删除

三、Job是在主线程,还是在Work线程上?

  1. 在Entities.ForEach()后接.Schedule,表示Entities.ForEach()在Work线程上执行(见图3.1)
  2. 在Entities.ForEach()后接.Run,表示Entities.ForEach()在主线程上执行(见图3.2)
  3. 当Entities.ForEach()内包含UnityEngine相关操作时,只能在主线程上操作,即,只能Entities.ForEach().Run
  4. 为了能使Entities.ForEach().Run中处于同步操作,不与Work线程上的Job冲突,可以在JobComponentSystem上添加AlwaysSynchroizeSystem特性(相当于多线程编程中的加锁lock, 见图3.3)

be35c4c69a2597ce2fae4ac9cad8af19.png
图3.1 .Schedule work线程上使用

b80c26232c1f66b699bd625658e47df8.png
图3.2 .Run 主线程操作

2249ea1d0f15eefc1accdc0ee9eab0e6.png
图3.3 AlwaysSynchroizeSystem保证执行这里的时候同步执行

四、ComponentSystem vs Entities.ForEach.Run()

这两个都是同步执行,那么用哪个好呢?有什么差别呢?

Unity官方的说法是,Entities.ForEach.Run()默认支持Burst Compiler,效率会更高,更推荐用这个接口。

c141310c672247c7ac06adad3ed8b160.png
Entities.ForEach.Run()默认支持BurstCompiler

五、Entities.ForEach设置支持BurstCompiler

  1. 如果需要支持,怎添加.WithBurst(见图5.1)
  2. 如果不需要支持,怎添加.WithoutBurst(见图5.2)

92f53f88b6b6b0db12fb8ca4471a2bc4.png
图5.1 包含burstComppiler

9c0d01eddd29a3643f6108cea1840da4.png
图5.2 不包含burstCompiler

六、同步实例化Entity

见下图40~42行,要同步生成Entity,需要先把GameObject Instantiate出来,这里以后有机会详细再姜。[1]

13a50251a8a747741b1bd781778dc8e2.png
创建Entity

参考

  1. ^[天天直播] 运用DOTS还原经典游戏《Pong》(下) https://www.bilibili.com/video/BV1r7411j7VT/?spm_id_from=333.788.videocard.4
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值