0
点赞
收藏
分享

微信扫一扫

【Unity开源项目精选】Entitas:Unity DOTS的先行者

Entitas

Entitas是Unity官方推出DOTS之前的一个开源ECS框架。不过自从Unity官方启动DOTS以来,Entitas就不再更新了,版本停留在了2019年2月20日发布的1.13.0。

虽然Entitas不再更新了,但是在旧版本的Unity(2019之前)和纯C#环境中还是可以使用的。

源码链接
https://github.com/sschmid/Entitas-CSharp

ECS是什么?

ECS即实体(Entity),组件(Component),系统(System),其中Entity,Component都是纯数据的类,System包含逻辑负责操控他们,这种模式会一定程度上优化我们的代码速度。

  • Entities 实体:游戏中的事物。
  • Components 组件:与Entity相关的数据,但是应该由数据本身而不是实体来组织。(这种组织上的差异正是面向对象和面向数据的设计之间的关键差异之一)
  • Systems 系统:Systems是把Components的数据从当前状态转换为下一个状态的逻辑,例如,一个system可能会通过他们的速度乘以从前一帧到这一帧的时间间隔来更新所有的移动中的entities的位置。

这么说好像还是很抽象,那咱们先来说说为什么ECS会很快吧。

为什么ECS性能好?

首先需要补充一些计算机组成原理前置知识。

  • CPU处理数据的速度非常快,往往会出现CPU处理完数据在那干等着的情况,所以需要设计能跟上CPU的高速缓存区来尽量保证CPU有事干,同时也提高了数据访问效率。
  • CPU自身有三级缓存,第一级最快,容量最小,第三级最慢,容量最大。
  • 我们常说的内存是指CPU拿取数据的起源点,CPU访问内存的速率远小于三级缓存速率。
  • CPU操作数据会先从一,二,三级缓存中取得数据,速度非常快,尤其在一级缓存处速率基本可以满足CPU的需求(即不让CPU歇着),但是有些情况下我们请求的数据不在这三级缓存中(缺页中断),就需要寻址到内存中的数据(包含这个数据的一整块数据都将被存入缓存),并且把目标数据放到三级缓存中,提高下一次的访问速度(因为这一次调用的数据块可能在不久的将来还会用到)。

ECS的数据组织与使用形式

ECS架构在执行逻辑时,只会操作需要操作的数据,而E和C这两者的配合把相关数据紧密的排列在一起,并且通过Fliter组件过滤掉不需要的数据,这样就减少了缺页中断次数,整体上提高了程序效率。

此外现代CPU中的使用数据对齐的先进技术(SIMD,Single Instruction Multiple Data,一条CPU指令多个数据)与这种数据密集的架构相性极好,可以进一步提高性能,但是需要有一定的SIMD编程经验(虽然C#编译器内部本来就有做这种SIMD优化)来处理具体的业务逻辑。

ECS有什么优势

对比传统的面向对象编程,ECS模式无疑更加适合现代CPU架构,因为它可以做到高效的处理数据而不用把多余的数据字段存入宝贵的缓存从而导致多次缺页中断。

举个例子就是传统模式下我们操作Unity对象的Position属性,他会把GameObject所有相关数据都加入缓存,浪费了宝贵的缓存空间。

而如果在ECS模式下,将只会把Position属性集放入内存,节省了缓存空间,也一定程度上减少了缺页频率,即常说的提高缓存命中率。

ECS真有那么神吗

很遗憾,答案是否定的,ECS在正常情景应用下性能和传统模式不分伯仲,有时甚至因为我们额外的管理分类操作而导致反而不如传统模式性能好的情况出现,它只适用于超多对象的统一管理与操作情形,这也是我们经常看到的ECS的Demo很震撼的原因之一了。

并且真正启用ECS还是有一定技术门槛的,需要有一定的SIMD编程经验,才能把良好数据管理的优势进一步的发挥出来。

扩展阅读


我是大智,你的技术探路者,下次见!

别走!点赞收藏哦!

好,你可以走了。

举报

相关推荐

0 条评论