ECS

ECS(Entity Component System)

ECS 是一种软件架构模式,由三个元素组成:实体 (Entity)、组件 (Component) 和系统 (System)。游戏程序分为这三个主要元素,并且通过定义每个系统的责任和关系来管理游戏。

主要元素

实体(Entity)

  • 代表游戏世界中的事物。
  • 实体本身没有特定功能,通过组件来定义其功能。
  • 可以将实体看作一个什么都没有的 GameObject。在 Unity 中,GameObject 含有 Transform 组件,这里可以将其看作没有 Transform 的 GameObject。

组件(Component)

  • 附加到事物的数据,包含状态信息。
  • 重点是数据,极致的数据,没有任何方法和逻辑,只包含数据。
  • 例如,在移动游戏角色时,位置、速度等每个状态都将成为一个组件部分,并与称为“角色”的实体相关联。
  • 修改角色状态时,只需要修改其单独的数据组件,不会触碰角色的逻辑。

系统(System)

  • 处理数据的系统,其中只有方法,没有任何数据。
  • 例如,在移动角色时,速度、位置等数据都存放在组件中,通过遍历实体的组件来修改数据。

世界(World)

  • 世界是实体的集合,实体 ID 在世界中是唯一的。
  • 世界包含一组实体、组件和系统,是一个独立的环境。
  • 世界负责系统的运行,在开发中可以创建多个世界,每个世界都是独立的,互不影响,但往往一个世界就足够了。

原型(Archetypes)

  • 由一组组件类型(Component Types)构成,表示具有相同组件集合的实体的类型。
  • 频繁的更改组件会导致程序性能降低。

结构变化

  • 创建销毁实体、添加删除组件、设置共享组件都会导致结构变化。
  • 结构变化可能会导致大量资源占用,影响性能,只能在主线程中操作。

ECS 的好处

1. 模块化设计

  • 组件化:ECS 将对象的特性分解为独立的组件,每个组件只包含特定的属性和数据。这种模块化设计使得代码更易于维护和扩展。
  • 系统分离:系统包含操作组件的逻辑,分离了数据和行为。这种分离提高了代码的可重用性和灵活性。

2. 高性能

  • 数据局部性:ECS 通过将相同类型的组件数据连续存储在内存中,提高了 CPU 缓存的命中率,从而优化了性能。

    • CPU 在读取数据时,首先会去 CPU 缓存中寻找。如果缓存中没有需要的数据,就会去内存中查找。访问内存的速度比访问缓存的数据慢很多,因此为了提高缓存命中率,避免频繁去内存中查找,我们尽量使用连续的数据结构进行处理。

    cpu流程

  • 并行处理:ECS 将逻辑分散在多个独立的系统中,可以更容易地实现并行处理,提高多线程环境下的性能。

3. 灵活性和可扩展性

  • 动态行为:通过添加或移除组件,可以动态改变实体的行为。这种灵活性使得 ECS 特别适合处理复杂的游戏逻辑和仿真场景。
  • 可扩展性:可以轻松添加新的组件和系统,而不会对现有代码造成破坏。

4. 简化的状态管理

  • 明确的状态分离:ECS 将状态信息存储在组件中,系统只负责处理相关的逻辑。这使得状态管理更清晰、更易于调试。