Bevy 作为一个数据驱动的游戏引擎, 其内部架构为 ECS(Entity-Component-System) 组件化设计模式。

为什么用ECS

  • 面向数据: 功能由数据驱动 在ECS中,数据是核心。系统的功能和行为主要通过数据的组织和处理来实现,而不是通过复杂的对象层次结构。
  • 清晰架构: 功能松耦合 / 防止深层次的继承嵌套 ECS通过将功能分解为独立的组件和系统,实现了功能之间的松耦合。这种方式避免了传统面向对象设计中常见的深层次继承结构,使得代码更加模块化和易于维护。
  • 高性能:高度并行且缓存友好 ECS的设计使得数据可以高效地存储和访问,支持高度并行的处理。由于数据通常按类型连续存储,这有助于提高缓存命中率,从而提升性能。

ECS定义

  • 实体(Entity):具有唯一 ID 的组件集合 实体是由多个组件组成的集合,并且每个实体都有一个唯一的标识符(ID)。实体本身没有具体的行为,其行为由所包含的组件和系统共同决定。
  • 组件(Component):只是一个普通的 Rust 数据类型。通常作用于单一功能 组件是包含特定数据的简单结构体,每个组件负责一个特定的功能。例如,Position 组件包含位置信息,Health 组件包含生命值信息。
  • 资源(Resource):共享的全局数据 资源是可以在整个系统中共享的数据,通常用于存储全局状态或配置信息。例如,资产存储可以用来管理游戏中的所有资源文件,事件系统可以用来处理游戏中的各种事件。
  • 系统(System):在实体、组件和资源上运行逻辑 系统是负责执行具体逻辑的模块。系统会遍历具有特定组件的实体,并对这些实体进行操作。例如,移动系统可能会更新所有具有 Position 和 Velocity 组件的实体的位置,伤害系统可能会处理所有具有 Health 组件的实体的伤害计算。

从概念上讲, 您可以将ECS和数据库和表格做类比。不同的数据类型(组件)就是像表的“列”,不同的组件组成了一行,EntityID就像行号,它就是一个整数索引,可以让您查找特定的组件值。

[Entity] (ID)[Transform]PlayerEnemy[Camera]Health
107<translation> <rotation> <scale>50.0
108<translation> <rotation> <scale>25.0
109<translation> <rotation> <scale><camera data>
110<translation> <rotation> <scale>10.0
111<translation> <rotation> <scale>25.0