在第四届中国计算机教育大会(Computer Education Conference of China)上,Unity 中国技术总监张黎明先生分享了 Unity DOTS 的基本概念、应用原理、1.0 版本的最新进展以及未来的开发计划。
大家好,非常荣幸参加这次大会,我是 Unity 的张黎明。
我给大家分享的内容是面向数据编程的技术栈。我们今年刚刚发布 DOTS 的 1.0 版本,从这个角度来讲它是一个非常新的技术。但是其实我们已经在 2018 年发布过 DOTS 最早的一个 demo 和当时的技术展示,从这个角度来讲,这个技术已经演进了五年时间。这也是 Unity 未来的一个发展方向,尤其是面向高性能的计算领域提供 Unity 的解决方案。
首先,为什么需要 DOTS?我们可以先看一个视频,Megacity 是我们 2018 年发布过的 DOTS demo。这是一个非常庞大的城市,里面有几百万个静态的 3D 的模型以及上万个音源,有数千个在空中飞行的汽车,它的计算量非常庞大。
在有 DOTS 技术之前,对老的 3D 引擎来讲,想实时做这种大规模的仿真或超复杂场景的渲染是非常困难的。后面会讲到为什么使用 DOTS 技术可以做到这种水平的仿真以及渲染。过去五年时间,Unity DOTS 经过了内部几代的演进,这个 demo 也有了最新的升级版,它是一个开源的工程,大家可以在 github Unity 仓库中找到。
第二个视频是游戏公司使用 DOTS 开发的一款游戏,这款游戏已经上线了。它的特点是里面做了非常多僵尸角色的仿真,有数万个 3D 角色,也是使用了 DOTS 并行计算的架构开发的。相对来说,这个游戏的场景比较简单,但是里面的动态角色是非常复杂的。
简单介绍一下为什么 DOTS 可以做到这样的效果。过去这么多年,CPU 其实已经遇到了一个瓶颈。最近 10 年 CPU 的单核性能其实已经没有太多提升了,不管是英特尔还是 AMD,它的 CPU 性能提升都是通过增加核的数量。现在我们已经能看到 32 核、64 核的 CPU,但是传统的 3D 引擎是很难把这么多核进行利用的。我们常见的引擎可能有主线程、渲染线程,再加一些 worker thread,最多利用十个核之内,无法利用特别多核的数量。DOTS 就能用来解决这个问题,方便我们开发并行计算的代码。
另外,过去这么多年 CPU 都是提供了单指令多数据的向量指令集,但对普通的引擎来讲,非常难把普通的代码进行这种向量化,可能有一部分代码可以向量化,但是向量化的程度并不高,没有把 CPU 里面 SIMD 指令集充分利用起来。DOTS 在这方面也提供了配套的工具。
我们来看一下什么是 DOTS。下方是简单的示意图,最上层蓝色的横条代表我们用 Unity 开发的 3D 程序或游戏。在应用的下层我们提供 ECS(Entity Component System)的框架,基于面向数据的思维设计,方便我们开发面向数据的应用程序。
在 ECS 框架之下有 Job System,它是方便我们把代码进行 Job 化来进行并行计算的工具。右侧有一个粉红色的方块,叫做 Burst 编译器,这个编译器是帮助我们把 Unity 里面开发者写的 C# 代码进行向量化的指令集。
接下来分别介绍一下这三个部分。
首先是 ECS(Entity Component System),它是 DOTS 的一个基础框架。在讲 ECS 之前,首先讲一下 Data Layout 为什么是很重要的。大家应该都知道,CPU 里面是有 Cache 的,CPU 代码执行的时候,一般首次去拿到数据是要在 CPU 的 Cache 进行访问。

UnityDOTS是一个用于高性能计算的技术栈,包括ECS(EntityComponentSystem)、JobSystem和Burst编译器。ECS通过数据连续存储优化内存访问,JobSystem支持并行计算,Burst编译器则能将C#代码转化为高效的向量化指令。DOTS1.0已发布,提供了网络同步、物理引擎和On-demandStreaming等功能,未来还将改进更多引擎模块,如动画和导航系统,以适应元宇宙和大规模游戏的需求。
最低0.47元/天 解锁文章
5967

被折叠的 条评论
为什么被折叠?



