ECS了解

entity:实体,就是一堆组件的集合,实体就是一堆组件的列表

component: 组件,仅有数据结构,没有功能函数,比如坐标组件,物理组件等等

system: 系统,仅有功能函数,没有数据结构,不可以有状态

实体中会把一堆组件聚合在一起。 在实体与组件这一层,只是数据的初始化与存储问题,还没有任何的游戏逻辑相关的内容,所以的逻辑都在更新中处理,即在一个系统中,对所以实体的所有组件,按则一定的规则,获得数据,使用逻辑代码更新数据,然后把相应的实体的组件的数据保存下来。这就是系统的功能。

守望先峰的ECS分享:http://gad.qq.com/article/detail/28682

以下引用云风的一些理解:

ECS 的 E ,也就是 Entity ,可以说就是传统引擎中的 Game Object 。但在这个系统下,它仅仅是 C/Component 的组合。它的意义在于生命期管理,这里是用 32bit ID 而不是指针来表示的,另外附着了渲染用到的资源 ID 。因为仅负责生命期管理,而不设计调用其上的方法,用整数 ID 更健壮。整数 ID 更容易指代一个无效的对象,而指针就很难做到。

C 和 S 是这个框架的核心。System 系统,也就是我上面提到的模块。对于游戏来说,每个模块应该专注于干好一件事,而每件事要么是作用于游戏世界里同类的一组对象的每单个个体的,要么是关心这类对象的某种特定的交互行为。比如碰撞系统,就只关心对象的体积和位置,不关心对象的名字,连接状态,音效、敌对关系等。它也不一定关心游戏世界中的所有对象,比如关心那些不参与碰撞的装饰物。所以对每个子系统来说,筛选出系统关心的对象子集以及只给它展示它所关心的数据就是框架的责任了。

ECS 的设计就是为了管理复杂度,它提供的指导方案就是 Component 是纯数据组合,没有任何操作这个数据的方法;而 System 是纯方法组合,它自己没有内部状态。它要么做成无副作用的纯函数,根据它所能见到的对象 Component 组合计算出某种结果;要么用来更新特定 Component 的状态。System 之间也不需要相互调用(减少耦合),是由游戏世界(外部框架)来驱动若干 System 的。如果满足了这些前提条件,每个 System 都可以独立开发,它只需要遍历给框架提供给它的组件集合,做出正确的处理,更新组件状态就够了。编写 Gameplay 的人更像是在用胶水粘合这些 System ,他只要清楚每个 System 到底做了什么,操作本身对哪些 Component 造成了影响,正确的书写 System 的更新次序就可以了。一个 System 对大多数 Component 是只读的,只对少量 Component 是会改写的,这个可以预先定义清楚,有了这个知识,一是容易管理复杂度,二是给并行处理留下了优化空间。

你可能感兴趣的:(ECS了解)