CECC | Unity DOTS:面向数据编程的技术栈

UnityDOTS是一个用于高性能计算的技术栈,包括ECS(EntityComponentSystem)、JobSystem和Burst编译器。ECS通过数据连续存储优化内存访问,JobSystem支持并行计算,Burst编译器则能将C#代码转化为高效的向量化指令。DOTS1.0已发布,提供了网络同步、物理引擎和On-demandStreaming等功能,未来还将改进更多引擎模块,如动画和导航系统,以适应元宇宙和大规模游戏的需求。
在第四届中国计算机教育大会(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 进行访问。
 一: 什么是ECS?       ECS是一种新的架构模式(当然是针对Unity本身来说),这是一个取代GameObject / Component 的模式。 其模式遵循组合优于继承原则,游戏内的每一个基本单元都是一个实体,每个实体又由一个或多个组件构成,每个组件仅仅包含代表其特性的数据(即在组件中没有任何方法)。系统便是来处理拥有一个或多个相同组件的实体集合的工具,其只拥有行为(即在系统中没有任何数据)。       ECS旨在比GameObject / MonoBehaviour更容易处理大量物体。ECS由于是面向数据的设计,所以很容易并行高速处理,以及与Unity开发的C#JobSystem/Burst Compiler一起工作,从而获取更高的项目运行性能。二:ECS总体发展历史       目前Unity公司由Mike Acton 大佬主持DOD(Data Oriented Design 面向数据设计)的全面改革与推进工作,目的是旨在进一步推进Unity系统本身与Unity项目的执行效率。    ECS总体发展:    A:Unity2018引入Entities之前,其实ECS框架早已经出现,但是ECS还是因为守望先锋采用了这个框架才被我们所熟知,后来Git上面出现了一个Entitas的插件可以直接用在Unity上面。Entitas-Unity(有多个语言的port版本,Entitas-Unity下统一称为Entitas) 是 Unity的一个ECS(Entity/Component/System)框架,是在github上面的一个开源项目。    B: 经过Unity公司的认可与改造,目前Unity2018.x 版本已经通过 Package Manager 提供了Unity版本的ECS插件,名称为:“Entities”。    C: Unity2019.x 版本,对“Entities”插件的API进行了进一步改造与完善,以更规范的API实现更加高效的与规范的编程模式。 三:ECS(一)轻松入门篇       本“ECS入门篇”旨在全面讲解ecs 的相关理论与简单Hello World 的编程模式,且通过Unity2018.x与Unity2019.x 两个不同API的编程模式,初步讲解ECS的编程规范与模式规范。        需要进一步学习ECS的小伙伴们,可以关注后续“ECS(二)小试牛刀”篇的进一步讲解。   《Unity ECS(二) 小试牛刀》https://edu.csdn.net/course/detail/27096 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值