#ecs #resources #parallel #systems #access-control #system

shred

并行调度需要读取某些资源的系统和需要写入其他资源的系统

44 个版本

0.16.1 2024年5月15日
0.16.0 2024年1月12日
0.15.0 2023年9月16日
0.14.1 2022年7月14日
0.4.3 2017年6月21日

#92 in 并发

Download history 3248/week @ 2024-05-02 3042/week @ 2024-05-09 2741/week @ 2024-05-16 2990/week @ 2024-05-23 3152/week @ 2024-05-30 2428/week @ 2024-06-06 2426/week @ 2024-06-13 2762/week @ 2024-06-20 2094/week @ 2024-06-27 1114/week @ 2024-07-04 2665/week @ 2024-07-11 2605/week @ 2024-07-18 2573/week @ 2024-07-25 2424/week @ 2024-08-01 3929/week @ 2024-08-08 2663/week @ 2024-08-15

11,951 每月下载量
用于 124 个 crates (13 个直接使用)

MIT/Apache

160KB
3K SLoC

shred - Shared resource dispatcher

Build Status Crates.io MIT/Apache Docs.rs LoC

此库允许并行调度具有相互依赖性、共享和独占资源访问的系统。

用法

extern crate shred;

use shred::{DispatcherBuilder, Read, Resource, ResourceId, System, SystemData, World, Write};

#[derive(Debug, Default)]
struct ResA;

#[derive(Debug, Default)]
struct ResB;

#[derive(SystemData)] // Provided with `shred-derive` feature
struct Data<'a> {
    a: Read<'a, ResA>,
    b: Write<'a, ResB>,
}

struct EmptySystem;

impl<'a> System<'a> for EmptySystem {
    type SystemData = Data<'a>;

    fn run(&mut self, bundle: Data<'a>) {
        println!("{:?}", &*bundle.a);
        println!("{:?}", &*bundle.b);
    }
}

fn main() {
    let mut world = World::empty();
    let mut dispatcher = DispatcherBuilder::new()
        .with(EmptySystem, "empty", &[])
        .build();
    world.insert(ResA);
    world.insert(ResB);

    dispatcher.dispatch(&mut world);
}

请参阅 基准测试 以获得更大的(且有用的)示例。

所需 Rust 版本

1.56.1稳定版

特性

  • 无锁
  • 不使用通道或类似功能(-> 更低开销)
  • 允许自动并行化和细粒度控制

贡献

欢迎贡献!如果您想要其他功能,只需创建一个 issue。如果您愿意,也可以帮助;只需选择一个“需要帮助”的 issue。如果您需要任何帮助,请随时提问!

所有贡献都假定在 MIT/Apache-2 下双许可。

许可证

shred 在 MIT 许可证和 Apache 许可证(版本 2.0)的条款下分发。

请参阅 LICENSE-APACHELICENSE-MIT

依赖项

~4MB
~75K SLoC