ECS设计框架

ECS,Entity(实体) Component(组件) System(系统),是一个gameplay层面的框架,它是建立在渲染引擎,物理引擎之上的,主要解决的问题是如何建立一个模型来处理游戏对象的更新操作,是对数据集合的操作。

  • Entity(实体),有点类似于Unity中的Game Object,在ECS中,它仅仅是一个Component(组件)的组合,不具有任何代表意义,它的意义就在于对其上的Component(组件)进行生命周期管理。
  • Component(组件)是一个只包含数据的组件,将每个可能单独使用的对象属性归纳,里面只有数据没有任何方法,如角色的生命值蓝量就是一个Component(组件),每个Entity(实体)是由多个Component(组件)组合而成,共享一个生命周期。
  • System(系统)则是用来处理数据的系统,里面只有方法,没有任何数据,每个System只关注于干好一件事情,它只关心那件事作用于游戏世界里同类的一组对象的每单个个体,或是这类对象的某种特定的交互行为。

ECS的作用

在System(系统)之间不用相互调用(减少相互耦合),是由游戏外部框架来驱动若干System(系统)的。这样一来每个System(系统)都可以独立开发,它只需要遍历框架提供给他的组件集合,做出正确的处理,更新组件状态就够了。

而编写Gamplay的人只需要清楚每个System(系统)到底做了什么,操作本身对哪些Component(组件)产生影响,正确书写System(系统)的更新次序就可以了。这样一来容易管理复杂度,二来给并行处理留下了优化空间

ECS的优劣

相比于传统的OOP,ECS在写法上要复杂很多,一个对象可以集中的数据来用多个Component(组件)来管理,还要额外的System(系统)来处理逻辑。但是,ECS它做到让设计分离了,由此的影响如下:

1. 减少多人开发时出问题的概率

如果有一个非常复杂的对象,许多人的工作都和这个对象有牵连,当A在进行逻辑处理时,他不得不传整个对象,还要考虑修改对其他人的影响;但是拆离后,A可以把自己的数据封在特殊的Component(组件)里,用自己的System(系统)处理,减少出问题概率(但是这样会增加代码复杂度);

2. 基于组合优于继承原则

组合优于继承,这是设计层面上的原则,而ECS的Entity(实体)则是Component(组件)的组合,提高了复用性,也方便我们只关注处理对下对象的某个局部;且当我们对某个功能进行拓展时,几乎不会影响到其它功能模块,因为每个部分都是几乎不关联的;

ECS设计框架

为什么组合优先于继承_Hopefully Sky的博客-CSDN博客_组合优于继承 

3. 容易预测和回滚

ECS的初衷就是为解决预测和回滚的,因为数据和状态都存储在Component(组件)里面,因此记录关键帧的数据和状态非常方便,这就使得实现预测和回滚容易许多;

4. 适合游戏开发层面做逻辑表现分离

同一套逻辑处理系统,加了表现组件就有了表现,可以放在客户端,不加的话就是纯逻辑,放在服务端确认客户端回传的数据。一套代码又能做服务器又能做客户端;

5. 提升性能

ECS这种面向数据的方式,使得内存排列天然紧密,非常适合现代CPU的缓存机制,极大增加了CPU的缓存命中率,大幅提升了性能。

6. ECS的劣势

ECS在处理大批量数据上有明显的优势,但是在处理小数据上如UI层面,网络层面上等就不太适合使用。而且Component(组件)本身不知道哪些System(系统)关注它,System(系统)也不知道什么时候关注的Component(组件)发生改变,即无法做到自驱动,必须有外部的东西来驱动这些System(系统)去工作,其实还需要许多Utility来辅助工作。
 

上一篇:Vue中实现检测当前是否为IE模式(极速模式还是兼容模式)


下一篇:12.组合模式