1.12 ECS

什么是Unity DOTS?

Unity面向数据的技术栈(data oriented tech stack, DOTS)包括以下主要部分:

  • Entity Component System 简记为ECS,提供了默认情况下写出高性能的代码的方法
  • C# Job System 提供了以并行的方式在多核CPU上运行游戏代码的方法
  • Burst compiler 一个math-aware,后端编译器(backend compiler),能产生高度优化的机器码(highly optimized machine code)

有了这些系统,Unity可以为你的目标平台的特殊能力,产生高度优化的代码。

Entity Component System (ECS)

ECS为游戏设计提供了较好的方式,使你可以专注于你要解决的实际问题:数据(data)和行为(behavior)。它利用C# Job System和Burst Compiler,使你能够充分利用现今的多核处理器。从面向对象到面向数据的设计使你能够更容易地重用代码,别人也更容易地理解你的代码。

ECS作为一个实验包(experimental package)发送,当前支持2018.3及以上版本。

C# Job System

新的C# Job System以一个安全、易用的方式利用多核处理器。容易是因为它被设计成向用户脚本开放,允许你写出完全、快速、jobified的代码,同时提供保护,避免一些多线程的陷阱,如:条件竞争(race conditions)。

C# Job System是Unity 2018.1之后一个内置的模板。

Burst

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

创建一个空白ECS项目指南

  1. 打开Unity Editor (2019.1.0f1及以上版本)
  2. 创建一个新的Project
  3. 打开Package Manager(菜单:Window > Package Manager)
  4. 点击Advanced按钮,打开Show preview packages选项
  5. 添加以下packages:
  6. Entities
  7. Hybrid.Renderer

添加Entities包时,也会把以下packages添加到项目中:

  • Burst
  • Collections
  • Jobs
  • Mathematics

注意: 你可以使用Unity Hub在一台电脑上安装多个版本的Unity。

关于Package Manager的详细使用方法,见这里

(后续会写更多关于Unity DOTS的内容。)

References:

  • https://unity.com/dots
  • ECS Sample Projects

ECS为什么有用?

ECS是Unity DOTS的一部分,即Entity Component System。

  • Extremely performant code (default) (默认写出的代码是极其高效的)
  • Easier to read (易读)
  • Easier to reuse code (易重用)
  • Take advantage of Burst Compiler for High Performance C# (充分利用Burst编译器和HPC#)
  • C# Job System (能够利用C# Job System)

总是,ECS是一种更好的组织数据的方式,让我们这些普通程序员也能写出极其高效的代码。

什么是ECS?

ECS基本上就是Unity中一个新的写代码的方式。使用ECS,我们将从传统面向对象编程转为面向数据编程。

当前,以传统或经典方式(Unity 2018以前)使用Unity时,基本上任何东西都是围绕着GameObjectMonoBehaviour。比方说,想创建一个玩家角色,一般情况下我们会创建一个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。

你可能感兴趣的:(c#)