#ecs #entity #gamedev #muge #data-structures

no-std muds-derive

Rust 游戏数据结构库,极简风格

2 个版本

0.1.1 2022年4月23日
0.1.0 2022年4月22日

#216 in #entity


muds 中使用

MIT 许可证

9KB
75

〰ᗰᑌᗪᔕ〰

极简数据结构和实体-组件-系统库


License: MIT Crates.io Docs.rs

概览

muds 是一个针对数据导向设计的高性能、实时应用(如游戏)的极简数据结构库。它提供了一个集合库,其数据结构以 代际索引 为键,并在其之上构建了一个 实体-组件-系统 (ECS) 库。

亮点

  • 灵活且可扩展的代际索引 ECS 模型
    • 支持类似关系数据库的多种实体类型,具有类型安全的实体 ID
    • 实体和组件的自定义存储类型
  • 跨平台;兼容 no_std 和 WASM 构建。默认使用 f64 代际索引与 WASM 中的 JS 互操作。
  • 极小的体积,极小的依赖,良好的性能
  • 库,不是框架。与具有 System 调度器/派发器的其他 ECS 不同,muds 不会控制你的程序流程。
  • 使用 cons 来优雅地执行类型级别的递归,而不是像其他 ECS 库中那样使用宏来实现固定长度的元组。

安装

[dependencies]
muds = "0.1"

特性

  • std - 启用 std 支持。默认启用。
  • serde - 启用集合和索引的 serde 序列化和反序列化实现
  • derive - 启用 #[derive)]#[derive)]
  • index-u64 - 使用 IndexU64 作为 ECS 的代际索引类型,而不是默认的 IndexF64

文档

参见 Docs.rs: https://docs.rs/muds

用法

以下是对 ECS 库的示例用法。更多示例请参阅 bench

use muds::prelude::*;
use muds::ecs::storage::SparseSetStorage;

// 1. Defines the entity and components.

#[derive(Entity, Debug)]
struct Ent;

#[derive(Component, Debug)]
struct Pos(u32, u32);

// `#[storage(S)]` can be used to customize the entity / component storage type.
#[derive(Component, Debug)]
#[storage(SparseSetStorage)]
struct Vel(u32, u32);

// 2. Registers the entity-components archetype to registry.
let mut registry = Registry::default();
registry.register_archetype::<Ent, Cons!(Pos, Vel)>();

// 3. Insert entities/components to mut storage.
// registry.storage returns cons of collection types.
// Each entity/component storage can be retrieved either as immutable (&C) or mutable (&mut C).
{
  let cons!(mut ent, mut pos, mut vel) = registry.storage::<&mut Ent, Cons!(&mut Pos, &mut Vel)>();
  for i in 0..10 {
      let eid = ent.insert(E);
      pos.insert(eid, Pos(i * 2, i * 2 + 1));
      vel.insert(eid, Vel(i, i + 1));
  }
}

// 4. Storages are just standard Map types that can be iterated.
// Use MapJoin trait to jointly iterate components as cons.
{
  let cons!(_ent, mut pos, vel) = registry.storage::<&Ent, Cons!(&mut Pos, &Vel)>();
  for cons!(_eid, v, p) in pos.iter_mut().cons().map_join(&*vel) {
      p.0 += v.0;
      p.1 += v.1;
  }
}

许可证

此存储库及其内部的代码受 MIT 许可证许可。有关更多信息,请参阅 LICENSE

依赖项

~1.5MB
~35K SLoC