13个版本 (破坏性更新)

0.10.0 2023年11月11日
0.9.0 2023年3月27日
0.8.2 2022年7月19日
0.8.0 2022年1月17日
0.2.0 2019年12月16日

#1125 in 过程宏

Download history 261/week @ 2024-03-11 285/week @ 2024-03-18 368/week @ 2024-03-25 356/week @ 2024-04-01 199/week @ 2024-04-08 262/week @ 2024-04-15 270/week @ 2024-04-22 280/week @ 2024-04-29 264/week @ 2024-05-06 248/week @ 2024-05-13 245/week @ 2024-05-20 238/week @ 2024-05-27 232/week @ 2024-06-03 169/week @ 2024-06-10 166/week @ 2024-06-17 336/week @ 2024-06-24

909 每月下载量
用于 63 个crate(直接使用3个)

Apache-2.0

22KB
475

hecs

Documentation Crates.io License: Apache 2.0

hecs提供高性能、极简主义的实体-组件-系统(ECS)世界。它是一个库,不是一个框架。使用World代替显式的"System"抽象,可以从常规代码中轻松查询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 模式还能提供卓越的速度和缓存局部性。内部跟踪具有相同组件的实体组。每个组都有一个密集的、连续的数组,用于存储每种类型的组件。当系统访问具有特定组件集的所有实体时,可以通过具有这些组件的超集的每个组进行快速的线性遍历。这实际上是一个列式数据库,具有相同的优势:CPU 可以准确预测内存访问,绕过不需要的数据,最大化缓存使用并最小化延迟。

为什么不使用 ECS?

hecs 致力于轻量级和无侵入性,以便在广泛的场景中发挥作用。即使如此,它并不适合每个游戏。如果你的游戏将只有少数类型的实体,可以考虑使用更简单的架构,例如将每种类型的实体存储在单独的普通 Vec 中。同样,对于不需要批量处理实体的游戏,ECS 可能过于复杂。

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

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

其他库

hecs 在很大程度上得益于 Rust 的 ECS 库生态系统中思想的自由交流。尤其有影响力的例子包括

  • bevy,它不断推动包含所有电池的框架中性能和易用性的边界
  • specs,它在 Rust 中推广 ECS 方面发挥了关键作用
  • legion,它展示了典型内存布局和无特质的组件

如果您觉得 hecs 不适合您,那么这些中的一个可能会满足您的需求!

许可

根据您的选择,许可方式为

贡献

除非您明确表示,否则您有意提交给本作品的所有贡献,根据 Apache-2.0 许可协议定义,将如上所述双重许可,不附加任何其他条款或条件。

免责声明

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

依赖关系

~300–750KB
~18K SLoC