ECS全称Entity-Component-System,即实体-组件-系统。是一种面向数据(Data-Oriented Programming)的编程架构模式。
这种架构思想是在GDC的一篇演讲《Overwatch Gameplay Architecture and Netcode》(翻成:守望先锋的游戏架构和网络代码)后受到了广泛的学习讨论。在代码设计上有一个原则“组合优于继承”,它的核心设计思想是基于这一思想的“组件式设计”。
ECS职责定义
Entity(实体):在ECS架构中表示“一个单位”,可以被ECS内部标识,可以挂载若干组件。
Component(组件):挂载在Entity上的组件,负载实体某部分的属性,是纯数据结构不包含函数。
System(系统):纯函数不包含数据,只关心具有某些特定属性(组件)的Entity,对这些属性进行处理。
运行逻辑
某个业务系统筛选出拥有这个业务系统相关组件的实体,对这些实体的相关组件进行处理更新。
基本特点
Entity数据结构抽象:
PosiComp |
MoveComp |
AttrComp |
... |
Pos |
Velocity |
Hp |
... |
Map |
- |
Mp |
... |
- |
- |
ATK |
... |
组件内聚本业务相关的属性,某个实体不同业务的属性通过组件聚合在一起。
从数据结构角度上看,Entity类似一个2维的稀疏表,如上述Entity数据结构抽象
OOP的思路知道类型就知道了这个对象的属性,ECS的实体是知道了有哪些组件知道这个实体大概是什么,有点像鸭子理论:如果走路像鸭子、说话像鸭子、长得像鸭子、啄食也像鸭子,那它肯定就是一只鸭子。
业务系统收集所有具有本业务要求组件的Entity,集中批量的处理这些Entity的相关组件
推论
ECS的组件式设计,是高内聚、低耦合的