讨论群: 827072601
爱发电: https://afdian.net/@taohuayuan
任务板: https://trello.com/b/StForyw7/taohuayuan
twitter: https://twitter.com/zephyr1125
wiki: https://taohuayuanwiki.a2hosted.com
大家新年快乐啊!
新旧交替的这两周,我仍然在继续进行着从Entitas向Unity ECS的改造。简单地说,如果不深入考虑新的内存优化与多线程的话,基本上两者思路还是差不多的。估计50%的工作量只是简单的按照新结构进行“翻译”的过程。
比较麻烦的一件事情是Unity ECS因为本身也还在预览状态,所以对于同一个目的的实现,他会提供好几种不同的方式,意在让开发者们自己尝试,提供反馈。将来Unity再决定保留哪些。因此对我来说也有着目前的取舍和将来的统一的问题。比如System的实现方案目前就有主要4种,简单介绍一下我的理解:
- ComponentSystem | 这是最简单直白的System,用起来也是与Entitas的System最接近的一个,从Entitas转过来,几乎就只是拷贝粘贴+修改语法格式的工作。但相对应的,使用他等于只应用了ECS结构,而不包含Job的多线程以及Burst Compile,因此没有性能优化。我对ComponentSystem的使用基本集中在2个情形下:
- 玩家操作处理,因为玩家操作的Entity量很小,并且牵扯Entity创建(Entity创建只能在主线程进行)。
- 只对主角有效的行为,原因很简单,主角只有一个人,所以对于只适用于他的System也没有多线程的必要。
- JobComponentSystem + [Inject] | 这里的关键是Inject, Inject很好用,产生、注入一切都在后台进行,你的代码很干净。然而Inject的后台操作却并不简单,他的实现比较累赘。这些在Unite 2018的 The Evolution of ECS API 演讲中有详细解释,因此官方已经有意移除Injection。因此我的游戏里已经在尽量不使用[Inject]。
- JobComponentSystem + IJobProcessData | IJobProcessData是一种直接给Job指定其所需Component的特殊Job类型,在使用这个方式下,你不需要自己显式监控你所关心的Component组,书写上是最为便利,同时官方也指出,在性能上也仅仅次于Chunk Iteration方式一点点。因此我目前在尽量都使用这一种方式来做。
- Chunk Iteration | 这是最为底层但是性能最好的方法。你需要人工遍历chunk,然后进行你的处理。这个方式写起来最麻烦,所以我目前的都没有用到。但是使用这个方式对理解Unity DOD新内存布局的底层原理会非常有帮助,所以我想我会接下来找几个性能压力最大的系统去使用这个方式书写,并且借此对Unity ECS底层的chunk结构好好学习一下。
因为还在改造的半途中,所以很抱歉的说这期的日志非常短,我也认为在改造完工之前,都还不到做总结的时候。最后,在开发过程中我还随手记了一点自己注意到的小tip分享一下。那么,下期见吧!(希望到时候已经改造完啦!)
Unit Test 经验
- 对JobComponentSystem测试时,一次Update之后需要跑一下EntityManager.CompleteAllJobs()来确保job都执行完毕,之后再检查结果
- 如果在一个测试中需要第二次Update,那么用于检验的ComponentDataArray需要在第二次Update之后再获取一次,因为NativeArray已被清理。
- 如果用到Barrier,在测试中也需要手动调用其Update
制作经验
- 对于hybrid的一个gameobject,使用CopyTransformToGameObjectComponent + PositonComponent 就可以指示Unity.TransformSystem自动基于PositionComponent移动Transform
- Component如何保存数组?由于数组的unblittable,无法在IComponent中保存数组,替代方案是IBufferElementData,使用示例参看PositionHistory及其测试,原始来源,官方文档
- 在IJobProcessComponentDataWithEntity里处理Buffer: https://forum.unity.com/threads/example-ijobprocesscomponentdatawithentity-and-ibufferelementdata.584548/
暂无关于此日志的评论。