凯发娱乐网

 找回密码
 立即注册

Unity新版ECS框架简介:ECS有什么不同?

凯发娱乐 www.cwagame.com.cn 发布者: D小游 | 发布时间: 2018-7-26 11:53| 评论数: 0

游戏程序
平台类型:  
程序设计:  
编程语言:  
引擎/SDK: Unity3D 
文/ Karm1ng

了解过ECS的开发者都知道ECS与Unity原本的开发理念相差很大,需要所有Unity开发者重新去学习和适应新的开发框架的代价还是很大的,Unity为何要做出这么大跨度的尝试呢?

Unity正在尝试解决什么问题?

以前我们基于Unity的GameObject/MonoBehaviour机制,可以非常简单为创作游戏编写代码,但最终往往让代码陷入难以阅读,维护和优化的境地。这是一系列因素联合导致的:

  • 面向对象模型
  • 由Mono编译的非最优机器码
  • GC机制
  • 单线程开发

Entity-Component-System 登场

Entity-Component-System 是一种编写代码的方式,简称ECS,近年因OW被广泛熟知,ECS主要关注开发中一个很基本的问题:如何组建并处理游戏中的数据和行为。

后续文章我们会更具体的讲解ECS的概念,本章我们简单介绍ECS在Unity中的使用。

采用ECS不但在设计上可以更好的进行游戏编程,还可以利用Unity提供的JobSystem和Brush编译器充分发挥多核处理器的性能。

Unity2017以后已经发布了JobSystem,基于JobSystem可以在C#代码中更好的实现多线程批处理技术,JoySystem底层为多线程间的竞争提供的安全保障。

对于开发者而言,更重要的是要使用一种新的思维方式和编码方式来充分利用JobSystem。

ECS有什么不同?

MonoBehavior -我们的老战友

MonoBehavior 既包含数据也包含行为。下面这段代码演示了Rotator组件每帧都要对Transform组件进行旋转操作。


然而MonoBehaviour 是继承于数个其它类的,且每个其它类包含了他们自己的数据,除了Transform,上面代码中没有用到任何他们中的数据。这其实浪费了很多不必要的内存,因此我们在设计一个系统时,需要考虑哪些数据是我们真正需要的。

ComponentSystem -迈入新纪元的一步



在ECS模型中,Component(组件)只包含数据。

ComponentSystem 则包含行为,一个 ComponentSystem 更新所有与之组件类型匹配的GameObject。

混合ECS:使用与 ComponentSystem 现有的 GameObject & components 一起工作

目前,现有的Unity工程基本都是基于MonoBehaviour&GameObject&components,如果想与现有GameObject&components一起使用ECS,混合ECS将是个不错的选择。上面的例子演示了我们可以简单的遍历访问即包含Rotator又包含Transform组件的实体对象。

ComponentSystem 是怎么访问Rotator和Transform的?

为了能像上面例子中那样可以遍历所有匹配组件类型的实体,这些实体必须由 EntityManager 创建。

ECS 框架提供了一个叫 GameObjectEntity 的组件,在OnEnable时,GameObjectEntity会在GameObject上创建一个含有所有组件的实体(Entity)。所以ComponentSystems 可以获取完整的GameObject及其所有组件。

因此在目前的情况下,如果你需要在ComponentSystems访问一个GameObject,则必须在该GameObject上添加一个GameObjectEntity组件。

如何将现有代码转为混合ECS?

我们要把MonoBehaviour.Update转换为ComponentSystems.OnUpdate的方式,可以继续将所有的数据保存在MonoBehaviour中,这是一种很简单向ECS的过渡方式。

因此场景数据仍然存在于GameObjects & components中,可以继续使用GameObject.Instantiate以创建实例等。

混合ECS的优点:

  • 数据与行为的分离的方式,会让代码整体看起来更清晰
  • 系统对许多对象是可以进行批量操作的,避免了一些无意义的调用。(见上面deltaTime优化)
  • 我们可以继续使用现有的Inspectors, Editor tools等工具

混合ECS的缺点:

  • 实例化时间并没有得到优化
  • 加载时间并没有得到优化
  • 数据是随机访问的,没有线性内存访问的高效性
  • 没有发挥多核功能
  • 没有SIMD

因此,使用ComponentSystem, GameObject 和 MonoBehaviour 结合是编写ECS代码的一个简易的改变?;旌螮CS提供了一些简单的性能改进,但是它并没有充分发挥ECS的所有性能优势。

纯ECS: 使用IComponentData & Jobs全面提升性能

通常让游戏具有更好的性能是选择ECS的一个重要原因,但如果我们利用CPU的SIMD特性来编写所有代码,其实最终的性能和基于ECS编写的是差不多的。

结合ECS与C# JobSystem将提供SIMD的可能性,以发挥CPU最大性能。

C# JobSystem 只支持structs和NativeContainers,并不支持托管数据类型。所以,在C# JobSystem中,只有IComponentData数据可以被安全的访问。

另外,EntityManager内部保证了ComponentData(组件)数据的线性内存布局,这是C# JobSystem中可以高效的使用IComponentData最重要的依据。




下一次我们将更详细的介绍ECS。
via: 游戏扶持by腾讯游戏学院





凯发娱乐网微信公众号二维码
关注我们官方微信公众号
游戏行APP二维码
下载我们官方APP-游戏行
游戏行APP二维码
关注手游动态微信公众号

最新评论

  • 又一创业者离世:生前3次创业 未及成功从22
  • 腾讯、网易夹缝中的游戏第二梯队
  • 这么有毒的文案,游戏圈也出现了...
  • ChinaJoy 2018:在焦虑中寻找新机会
  • 作为游戏设计师,你追求的游戏性是什么?
  • 炸裂!苹果半日下架App超2万,涉赌类、马甲

小黑屋|稿件投递|广告合作|关于本站|凯发娱乐 ( 闽ICP备05005107-1 )

GMT+8, 2018-8-10 14:37

快速回复 凯发娱乐 返回列表