Hi!
文章来源:Ask the Unity expert: what is the ECS?
在这里,这是关于这个主题一系列文章的第一篇,我们将解释Unity的ECS是什么以及它能为你的游戏做些什么。
Unity的ESC的主要好处是默认性能。为了实现这一点,ECS从传统的面向对象编程(即大多数unity开发者所熟悉的以GameObject和MonoBehaviour为中心的工作流)转向面向数据编程。为了说明他们的不同,让我们比较一下你如何用每种方法构建一个代表玩家角色的对象:
使用面向对象编程,你要创建GameObject来代表玩家角色,然后添加MonoBehaviours来赋予GameObject功能,例如玩家控制器、健康状况和物理属性。这些MonoBehaviours包含数据(例如生命值)和修改数据的代码(例如当玩家受到伤害时生命值减少)
使用面向数据的设计,你要创建一个实体来代表玩家角色,然后附加组件来存储数据。ECS组件不应该与GameObject组件混淆,比如MonoBehaviours。不像GameObject组件,ECS组件不会包含任何的逻辑,它们只是存储数据。我们用来在实体和它们的组件上执行操作的代码以sysytems的形式存在。Systems即脚本。它们大多数操作世界上所有的实体和组件。
为了继续前面生命值递减的例子,一个system对所有的具有健康和伤害组件的实体进行分组并对相应的受影响的组件递减生命值。
##ECS的好处是什么? 面向数据设置的内存布局确保由ECS生成的diamante再内存地址之间执行的跳转比传统的面向对象编程要少的多。
此外,ECS的内存布局允许利用缓存预取进行进一步的代码优化。你的CPU使用的这个进程确保在需要的时候它已经把下一比特的数据加载到缓存中了。Unity ECS通过使用同样大小的组件块来实现这一点。这些组件块是可以线性迭代的。CPU不需要处理各种大小的随机存储的对象,只需要处理这些线性存储在相同内存区域的大小相同的块。这样使CPU的工作更容易,有点像玩1*1的俄罗斯方块。 通过解耦数据(实体和组件)和逻辑(系统),ECS还生成了更加模块化、更易于阅读的代码。作为一名致力于不太可能的面向Unity的SpatialOS Game Development Kit (GDK, 它建立在Unity的ECS上)的开发者,我对这一点尤其感兴趣。ECS概念上反映了SpatialOs(实体、组件和操作他们的工作人员),因此非常适合SoatialOS GDK。
为什么不是每个人都使用ECS? 有了这么多好处,你可能有疑问?为什么不是每个人都使用ECS?首先,ECS并不适合所有人。在不太可能的情况下,我们对此感到兴奋,因为它支持Spatial OS 所支持的大量的、多人的且持久的游戏,但是有些游戏(比如回合制策略游戏)并不需要这种性能。 其次,ECS仍然处于开发的试验阶段。Unity先用的工具和系统仍然只设计用于FGameObjects和MonoBehaviours。
##SpatialOS的ECS和MonoBehaviour工作流 为了缓解这些痛点,SpatialOS GDK for Unity提供了两个工作流选项:
1、以MonoBehaviour为中心的工作流,这个工作在Unity所有的已开发的MonoVehaviour工具、工作流和APIs。
2、ECS工作流,这个利用了ECS开发范式和相关的性能改进。
至关重要的是,这些工作流并不相互排斥。鉴于目前缺乏围绕ECS的工具,我们预计你将使用MonoBehaviours来编写大部分或者全部的游戏。无论你选择哪个工作流,你的游戏都将能利用我们使用使用ECS编写的GDK核心模块。我们的目标是通过我们的自己的API和抽象层尽早的给你带来ECS的好处。这种方法使你免受Unity对他们的ECS所做的大部分破坏性改变,所以你可以专注于编写你想要的游戏。 在下一篇文章中我们将详细研究这两种工作流,并检查每种工作流的代码示例。在那之前,这里有更多的关于Unity ECS和SpatialOS GDK for Unity的资源。
###ECS资源列表
Unity’s ECS samples repository
Video playlist: Intro To The Entity Component System
Voxelman, an ECS tech demo by Keijiro Takahashi
SpatialOS GDK for Unity Github
To use, see:Jektify - Doc
Goodbye!
Put a very powerful message.