Latest commit 85dac0c
ECS as a Data Structure
相关的官方文档:[ecs_guide]
Bevy 用 Bevy ECS 来储存和管理数据。
可以把 ECS 比作数据库或电子表格,不同的数据类型(组件)就像表格的 “列”,可以有任意多的“行”(实体),“行”包含各种组件的值或实例。
如果游戏中有许多表示不同事物(玩家、NPC、怪物)的实体,那么创建一个 Health 组件之后,所有这些实体都可以添加 Health 组件。编写游戏逻辑(系统)变得简单:只用必要的组件来操作实体,例如,涉及“伤害”时,只需用 Health 组件即可。游戏逻辑变得非常灵活和可重用。
一个实体所拥有的组件的集合(组合),称为该实体的原型。
注意,实体不仅限于“游戏世界中的对象”。ECS 是一个通用的数据结构,实体和组件可以存储任何数据。
性能
Bevy有智能调度算法,会尽量并行运行系统,前提是系统能安全地访问数据(无数据竞争)。因此无需额外的开发工作,游戏就能多核心运行你的项目。
把数据分割成更小的类型(组件),把逻辑分割成多个更小的函数(系统),可以提高并行运行的机会。数据与系统的相关性越大,系统访问数据时冲突就越少,游戏运行速度就越快。
Bevy 对性能的经验法则是:颗粒度越细越好。
面向对象语言出身的程序员须知
你可能习惯用“对象类”来思考,例如,你可能定义一个包含 “player” 所有字段或属性的大型 Player 结构体。在 Bevy 中,这是不好的做法,会增加数据处理的难度,并限制性能。相反,当不同的数据可能被独立访问时,你应该把事情细化。例如,把游戏中的 “Player” 表示成由组件组成的实体,组件可以是“生命值”、“经验值”等,也可以是 Bevy 内置组件(例如 Transform)。
但是像 Transform 或坐标等,不应过度细化,它们作为单独的结构体才有意义,因为它们的字段不能独立地发挥作用。