跳转至专题目录
专题推荐文章:
- 温故知新——RectTransform成员属性的再认识
- unity Scene View扩展之编辑器扩展总结
- Unity获取鼠标点击ui GameObject
本系列目录
- DotsSample笔记
- Dots代码阅读笔记——IConvertGameObjectToEntity的一生
- Dots代码阅读笔记——ConvertToEntity的一生
- Dots代码阅读笔记——IConvertGameObjectToEntity的一生 (图解)
- IConvertGameObjectToEntity,ConvertToEntity,GameObjectEntity三者之间的关系和区别
- Dots代码阅读笔记—GenerateAuthoringComponentAttribute的一生
- 转Entity的接口那么多,那么从资源加载的GameObject到底怎么转Entity?
- Unity2019.3 DOTS代码简化笔记
- unity DOTS中的JobComponentSystem使用介绍
一、Entities.ForEach()参数介绍
- Entities.ForEach()表示,包含参数中的组件的Entity,可以对它进行操作
- 参数添加ref,表示需要修改IComponentData数据
- 参数添加in,表示只读IComponentData,
- ref参数在前面,in参数在后面,可提升Job运行效率。
- 如果所操作的Entity需要包含某个IComponentData,但是不需要读,不需要写,可以添加一个WithAll<T>(),表示操作的Entity需要包含T组件(见图1.2)
二、Entities.ForEach()怎么对Entity操作?
如果需要改变Entity结构,加组件,删组件,删Entity时,怎么操作呢?
Entities.ForEach()第一个参数为Entity类型,然后可以在下面两种方法中选一种。
- Entities.WithStructuralChanges(),该方法表示Entities.ForEach()中Entity会被进行修改,具体修改方法使用EntityManager中的接口(见图2.1)
- EnittyCommandBuffer,将EntityManager改为EnittyCommandBuffer,然后在Entities.ForEach()外部进行PlayBack即可,不过注意需要Dipose()掉该buffer(见图2.2)
三、Job是在主线程,还是在Work线程上?
- 在Entities.ForEach()后接.Schedule,表示Entities.ForEach()在Work线程上执行(见图3.1)
- 在Entities.ForEach()后接.Run,表示Entities.ForEach()在主线程上执行(见图3.2)
- 当Entities.ForEach()内包含UnityEngine相关操作时,只能在主线程上操作,即,只能Entities.ForEach().Run
- 为了能使Entities.ForEach().Run中处于同步操作,不与Work线程上的Job冲突,可以在JobComponentSystem上添加AlwaysSynchroizeSystem特性(相当于多线程编程中的加锁lock, 见图3.3)
四、ComponentSystem vs Entities.ForEach.Run()
这两个都是同步执行,那么用哪个好呢?有什么差别呢?
Unity官方的说法是,Entities.ForEach.Run()默认支持Burst Compiler,效率会更高,更推荐用这个接口。
五、Entities.ForEach设置支持BurstCompiler
- 如果需要支持,怎添加.WithBurst(见图5.1)
- 如果不需要支持,怎添加.WithoutBurst(见图5.2)
六、同步实例化Entity
见下图40~42行,要同步生成Entity,需要先把GameObject Instantiate出来,这里以后有机会详细再姜。[1]
参考
- ^[天天直播] 运用DOTS还原经典游戏《Pong》(下) https://www.bilibili.com/video/BV1r7411j7VT/?spm_id_from=333.788.videocard.4