【游戏架构】 - 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

GitHub - sschmid/Entitas: Entitas is a super fast Entity Component System (ECS) Framework specifically made for C# and Unity

  • 标题: 【游戏架构】 - ECS
  • 作者:
  • 创建于 : 2023-11-25 22:16:55
  • 更新于 : 2023-11-25 22:16:55
  • 链接: https://sxl-space.tk/2023/11/25/005_ECS/
  • 版权声明: 版权所有 © 宋,禁止转载。