Unity面向数据的技术栈(data oriented tech stack, DOTS)包括以下主要部分:
有了这些系统,Unity可以为你的目标平台的特殊能力,产生高度优化的代码。
ECS为游戏设计提供了较好的方式,使你可以专注于你要解决的实际问题:数据(data)和行为(behavior)。它利用C# Job System和Burst Compiler,使你能够充分利用现今的多核处理器。从面向对象到面向数据的设计使你能够更容易地重用代码,别人也更容易地理解你的代码。
ECS作为一个实验包(experimental package)发送,当前支持2018.3及以上版本。
新的C# Job System以一个安全、易用的方式利用多核处理器。容易是因为它被设计成向用户脚本开放,允许你写出完全、快速、jobified的代码,同时提供保护,避免一些多线程的陷阱,如:条件竞争(race conditions)。
C# Job System是Unity 2018.1之后一个内置的模板。
Burst是一个新的LLVM-based, math-aware的后端编译器(backend compiler)。它把C# jobs编译高度优化的机器码,充分利用目标平台的特定能力(particular capabilities)。
Burst是一个实验包,支持Unity 2018.3及以后版本。
Watch Joachim Ante present these new systems at Unite Austin
添加Entities包时,也会把以下packages添加到项目中:
注意: 你可以使用Unity Hub在一台电脑上安装多个版本的Unity。
关于Package Manager的详细使用方法,见这里
(后续会写更多关于Unity DOTS的内容。)
References:
ECS是Unity DOTS的一部分,即Entity Component System。
总是,ECS是一种更好的组织数据的方式,让我们这些普通程序员也能写出极其高效的代码。
ECS基本上就是Unity中一个新的写代码的方式。使用ECS,我们将从传统面向对象编程转为面向数据编程。
当前,以传统或经典方式(Unity 2018以前)使用Unity时,基本上任何东西都是围绕着GameObject
和MonoBehaviour
。比方说,想创建一个玩家角色,一般情况下我们会创建一个GameObject
,然后命名为Player
。然后,为了使这个玩家具有某些功能,我们会为这个Player
对象添加各种组件(即各种MonoBehaviour
)。这些添加的组件负责实现渲染(rendering, 如MeshRenderer),物理效果(如碰撞)和移动等。
然而!!!使用ECS时,我们的游戏会分成三个部分: Entities, Components和Systems。没有GameObject和MonoBehaviour的概念了(以兼容模式使用ECS时,还可以部分地使用MonoBehaviour。Unity提供了工具把GameObject转换为Entity)。
Entities 用于把components组织起来。它们很像传统方式中的(轻量级的)GameObject。
Components 只是数据的容器,不包含任何逻辑(即对数据的处理)。
Systems 中包含的是游戏逻辑、行为(behavior),处理Components中的数据。这意味着一个System负责处理所有具有某些Components的Entities。
现在,使用ECS的情况下,我们要创建一个玩家角色(player),我们会创建一个Entity,再在这个Entity上放置Components。注意,这些Components唯一的工作就是存储关于一个player的数据,没有任何逻辑。然后,我们创建Components,例如,创建一个render system,来渲染所有的Entities。ECS包已经提供了一些基本的可用的Systems。