【游戏架构】 - ECS
为什么选择ECS
在游戏开发中,随着项目规模的扩大和功能的复杂化,传统的面向对象编程(OOP)逐渐暴露出继承链冗长、耦合度高、扩展性差等问题。ECS解决了这些问题,比较经典的案例是《守望先锋》。
核心
CS架构由三个核心部分组成:实体(Entity)、组件(Component)和系统(System)。它们共同构建了一个基于组合优于继承的设计模式,解决了传统OOP中的诸多痛点。
实体(Entity)
- 定义:实体是游戏中的基本单元,例如玩家、敌人、道具等。它本身不包含任何数据或行为,仅仅是一个唯一标识符(ID)。
- 特点:实体通过关联不同的组件来“拥有”功能。例如,一个“玩家实体”可能包含位置组件、生命值组件和渲染组件。
组件(Component)
- 定义:组件是描述实体特性的纯数据结构,不包含任何逻辑。每个组件只负责存储特定类型的数据。
- 特点:
- 无行为:组件只包含数据(如位置、速度、生命值),没有方法。
- 高内聚:每个组件专注于单一功能。
系统(System)
- 定义:系统是处理实体集合逻辑的行为集合,负责更新实体的状态。系统根据组件类型筛选实体,并执行相应的逻辑。
- 特点:
- 无状态:系统不存储数据,只处理逻辑。
- 高复用性:一个系统可以处理多个实体。
优势
高性能与内存优化
- 内存连续性:ECS通过将相同类型的组件存储在连续的内存块中,显著提升了缓存命中率。
- 批量处理:系统可以高效地处理具有相同组件类型的实体集合,减少CPU开销。
高扩展性与灵活性
- 动态组合:通过添加或移除组件,可以灵活调整实体的功能。例如,为敌人实体添加AI组件即可赋予其自主行为。
- 模块化设计:系统之间相互独立,便于团队协作和功能扩展。
多线程支持
- 并行处理:由于组件数据独立,系统可以利用多线程并行处理实体集合,充分发挥多核CPU的性能。
不足
- ECS的设计理念与传统面向对象编程(OOP)有显著差异,开发者需要重新适应“数据驱动”的思维模式。
- 组件仅存储数据,系统处理逻辑,导致状态变化的追踪变得复杂,调试和排错难度较大。
- 为了性能优化,组件通常设计为最小单元,导致代码分散。
- 组件数据是公开的,任何系统都可以修改,容易引发冲突。
- ECS的核心优势在于大规模实体处理(如MMO、RTS),但小型项目可能因复杂性收益不足。
ECS与传统OOP的对比
| 特性 | 传统OOP | ECS架构 |
|---|---|---|
| 继承结构 | 多层继承,容易导致菱形继承问题 | 无继承,基于组合设计 |
| 耦合度 | 基类修改会影响整个继承链 | 组件和系统解耦,修改不影响其他部分 |
| 扩展性 | 需要频繁修改基类或子类 | 通过添加新组件和系统即可扩展功能 |
| 性能优化 | 内存布局分散,缓存命中率低 | 数据按组件类型连续存储,缓存效率高 |
| 团队协作 | 类结构复杂,协作难度大 | 组件和系统模块化,协作更简单 |
参考链接
Overwatch Gameplay Architecture and Netcode - YouTube
GitHub - egametang/ET: Unity3D Client And C# Server Framework
- 标题: 【游戏架构】 - ECS
- 作者: 宋
- 创建于 : 2023-11-25 22:16:55
- 更新于 : 2023-11-25 22:16:55
- 链接: https://sxl-space.tk/2023/11/25/005_ECS/
- 版权声明: 版权所有 © 宋,禁止转载。