本系列文章使用Unity最新版本Unity 2019.3.0f6,大家可以感觉到Unity 2019.3发布得非常慢,其实有个重要原因就是他们引擎内部也在全面转DOTS,DOTS可以给Unity引擎带来巨大的性能提升。2020年我相信DOTS会在世界范围内全面开花结果,各大游戏公司也会转向DOTS开发。
DOTS的全称是Data-Oriented Tech Stack (DOTS),翻译过来就是多线程式数据导向型技术堆栈(DOTS)。原理就是充分利用CPU多核处理器,让游戏处理的速度更快,更高效。
Unity官方分享了一个来自瑞典的游戏工作室的教程,他们工作室的一个项目需要海量的僵尸角色在屏幕中,主角可以发射大量的弹道和僵尸交互,项目有了性能优化所以不得不采用了DOTS方案。
如下图所示,是对他们的采访,可见他们使用DOTS的方案带来了巨大的效率优化。
这里再插播一句,2019年12月,在北京UUG上我也分享过一期DOTS的视频。
可能大家对效率高没有什么概念,我们从他们提供的一组数据中来看看DOTS到底能提升多大的效率,如下图所示,场景中一共放置2000个游戏对象进行同步坐标操作。
传统游戏对象方式需要9毫秒。
使用ECS只需要1毫秒,性能提升了9倍。
ECS+Job System只需要0.2毫秒,性能提升了45倍。
ECS+Job System + Burst Compiler 场中放置2W个游戏对象,仅需要0.04毫秒,性能提升了2250倍。
在正式进入学习之前,首先我们看一张图,如下图所示看看神秘的ECS写法和传统MonoBehaviour有什么区别。其实就是把原本MonoBehaviour中数据部分和逻辑部分分拆在IComponentData和ComponentSystem中完成。
通过这个简单例子我相信大家已经对学习ECS充满了信心,那我们就正式开始啦!
文章简介
DOTS全称是Data-Oriented Tech Stack,翻译过来就是多线程式数据导向型技术堆栈(DOTS),它由任务系统(Job System)、实体组件系统(ECS)、Burst Compiler编译器三部分组成。DOTS保证相同类型组件在内存中都是顺序排列,极大程度增加缓存的命中率,此外配合任务系统(Job System)让开发者无需头疼多线程同时访问数据需要手动加解锁的麻烦,最终加持Burst Compiler让性能飞起来。文本以最新的Unity 2019.3版本,学习DOTS的原理、ECS系统原理、Burst Compiler原理和JobSystem原理,带你掌握DOTS让游戏性能提升2000倍的秘密。
适合读者
对DOTS感兴趣的开发人员
想要快速入门及掌握DOTS的技术人员
希望将现有游戏转成DOTS的开发人员
你将获得
DOTS设计的核心思想
Unity 2019.3新版本DOTS的重大更新
ECS系统原理、Burst Compiler原理、JobSystem原理介绍
详细课程可前往《DOTS深度研究之原理分析篇》查看。
1.1 DOTS的组成部分
通过前面的数据我们可以发现ECS + Job System + Burst Compiler的性能简直逆天,这三个东西加在一起就是DOTS的终极性能表现,DOTS主要由这三部分组成:
1. 任务系统(Job System),可用于高效运行多线程代码。
2. 实体组件系统(ECS),用于默认编写高性能代码。
3. Burst Compiler编译器,用于生成高度优化本地代码,提供单指令多数据(SIMD)。
另外,Unity的H5技术方案Tiny也是完全基于DOTS的。DOTS的使用非常灵活,完全可以只用ECS或者ECS + Job System 或者ECS + Job System + Burst Compiler,灵活的好处就是移植性,现在有很多产品都已经开发了一半,如果一上来就全部切到DOTS意味着全都要推倒重来,这是不现实的。
这些开发了一半的产品就可以考虑选择性使用DOTS,比如游戏中有一些大量计算带来的耗时操作,我们可以使用Job System把它放入多线程中。如果场景需要有些大量的模型元素,比如飞行射击类游戏的子弹,为了不影响原有框架的结构,可以让子弹使用ECS + Job System + Burst Compiler,别的还是采用原始游戏对象的方式,这样将大大减少移植的时间。