#ecs #component #entity #world #entities #applications #minimalist

no-std hecs

一个快速、最小化且高效的实体-组件-系统库

56 个版本

0.10.5 2024年5月5日
0.10.4 2023年11月11日
0.10.3 2023年4月9日
0.10.1 2023年3月27日
0.1.0 2019年11月13日

#66数据结构

Download history 1044/week @ 2024-05-02 702/week @ 2024-05-09 741/week @ 2024-05-16 658/week @ 2024-05-23 820/week @ 2024-05-30 512/week @ 2024-06-06 635/week @ 2024-06-13 695/week @ 2024-06-20 388/week @ 2024-06-27 399/week @ 2024-07-04 461/week @ 2024-07-11 646/week @ 2024-07-18 1091/week @ 2024-07-25 524/week @ 2024-08-01 795/week @ 2024-08-08 481/week @ 2024-08-15

3,000 每月下载量
用于 77 个包 (34 直接)

MIT/Apache

290KB
6K SLoC

hecs

Documentation Crates.io License: Apache 2.0

hecs提供了一个高性能、最小化且高效的实体-组件-系统(ECS)世界。它是一个库,不是一个框架。在显式的“系统”抽象代替中,可以从常规代码中轻松查询World的实体。按照您喜欢的任何方式组织您的应用程序!

示例

let mut world = World::new();
// Nearly any type can be used as a component with zero boilerplate
let a = world.spawn((123, true, "abc"));
let b = world.spawn((42, false));
// Systems can be simple for loops
for (id, (number, &flag)) in world.query_mut::<(&mut i32, &bool)>() {
  if flag { *number *= 2; }
}
// Random access is simple and safe
assert_eq!(*world.get::<&i32>(a).unwrap(), 246);
assert_eq!(*world.get::<&i32>(b).unwrap(), 42);

为什么是ECS?

ECS架构使得轻松组合松散耦合的状态和行为变得容易。ECS世界由以下内容组成:

  • 任何数量的 实体,代表不同的对象
  • 与每个实体关联的组件数据集合,其中每个实体最多有一个任何类型的组件,并且两个实体可能具有不同的组件

然后通过 系统 来操作这个世界,每个系统都访问具有特定组件类型的所有实体。系统实现如物理(例如通过访问“位置”、“速度”和“碰撞”组件)或渲染(例如通过访问“位置”和“精灵”组件)等自包含的行为。

可以在不干扰现有逻辑的情况下向复杂应用程序添加新的组件和系统,这使得ECS模式非常适合定义在相同一组对象上的多个重叠行为的应用程序,特别是如果将来将添加新的行为。这种灵活性使其与传统基于显式定义的对象类型异构集合的方法区别开来,在实现新的行为组合(例如既是车辆又是任务给予者的车辆)可能需要广泛的变化。

性能

除了具有出色的可组合性外,ECS 模式还能提供卓越的速度和缓存局部性。内部跟踪具有相同组件的实体组。每个组都有一个密集的、连续的数组来存储每种类型的组件。当系统访问具有特定组件集的所有实体时,可以通过具有这些组件超集的每个组进行快速线性遍历。这实际上是一个列式数据库,具有相同的优势:CPU 可以精确预测内存访问,跳过不需要的数据,最大化缓存使用并最小化延迟。

为什么不选择 ECS 呢?

hecs 努力保持轻量级和无侵入性,以便在广泛的领域中发挥作用。即使如此,它也不适合所有的游戏。如果你的游戏将只有少量类型的实体,可以考虑使用更简单的架构,例如将每种类型的实体存储在单独的平面 Vec 中。同样,对于不需要批量处理实体的游戏,ECS 可能是过度的。

即使对于从中受益的游戏,ECS 世界也不是万能的数据结构。大多数游戏将在其他结构中存储大量的状态。例如,许多游戏维护一个空间索引结构(例如,瓦片地图或边界体积层次结构),用于在特定位置附近找到实体和障碍物,以进行高效的碰撞检测而无需搜索整个世界。

如果您需要使用除组件类型以外的标准搜索特定实体,请考虑在您的世界中维护一个专用索引,存储 Entity 处理程序和所需的其他数据。在生成相关实体时插入索引,并包括一个组件,允许在销毁时有效地从索引中删除。

其他库

hecs 极大受益于 Rust ECS 库生态系统中思想的自由交流。特别有影响力的是以下示例:

  • bevy,它不断推动在包含电池的框架中性能和易用性的极限
  • specs,它在 Rust 中推广 ECS 起了关键作用
  • legion,它展示了典范内存布局和无特质的组件

如果您觉得 hecs 不适合您,那么这些中的任何一个可能都适用!

许可证

根据以下之一许可:

任选其一。

贡献

除非您明确表示,否则任何您有意提交以包含在作品中的贡献,根据 Apache-2.0 许可证定义,都应作为上述双重许可,不附加任何额外的条款或条件。

免责声明

这不是一个官方的 Google 产品(实验性的或其他),这只是 Google 拥有的代码。

依赖关系

~1.3–1.7MB
~25K SLoC