#hecs #parallel #entity #component #ecs

yaks

通过 rayon 自动多线程的 hecs 的最小化框架

2 个不稳定版本

0.1.0 2020年6月6日
0.0.0-alpha12020年1月14日

并发 中排名 491

MIT/Apache

93KB
1.5K SLoC

yaks

Latest Version Documentation License

yaks 旨在通过 rayonhecs 提供一个最小化且性能卓越的自动多线程框架。

目标是,不分先后顺序

  • 安全性
  • 简洁性
  • 性能
  • 可扩展性
  • 紧密工程
  • 最小化依赖
  • 轻松实现并发

Cargo 功能

  • parallel - 默认启用;可以通过禁用它来强制 yaks 在单个线程上工作。适用于一次编写代码,并在具有或没有线程的平台上演示。
  • test - 如果启用,将关闭内部丢弃检查。当自动测试恐慌条件时,可用于防止恐慌。

示例

更详细和注释的示例可以在 此处 找到。

use hecs::{With, Without, World};
use yaks::{Executor, QueryMarker};

fn main() {
    let mut world = World::new();
    let mut entities = 0u32;
    world.spawn_batch((0..100u32).map(|index| {
        entities += 1;
        (index,)
    }));
    world.spawn_batch((0..100u32).map(|index| {
        entities += 1;
        (index, index as f32)
    }));
    let mut increment = 5usize;
    let mut average = 0f32;
    let mut executor = Executor::<(u32, usize, f32)>::builder()
        .system_with_handle(
            |context, (entities, average): (&u32, &mut f32), query: QueryMarker<&f32>| {
                *average = 0.0;
                for (_entity, float) in context.query(query).iter() {
                    *average += *float;
                }
                *average /= *entities as f32;
            },
            "average",
        )
        .system_with_handle(
            |context, increment: &usize, query: QueryMarker<&mut u32>| {
                for (_entity, unsigned) in context.query(query).iter() {
                    *unsigned += *increment as u32
                }
            },
            "increment",
        )
        .system_with_deps(system_with_two_queries, vec!["increment", "average"])
        .build();
    executor.run(&world, (&mut entities, &mut increment, &mut average));
}

fn system_with_two_queries(
    context: yaks::SystemContext,
    (entities, average): (&u32, &f32),
    (with_f32, without_f32): (
        QueryMarker<With<f32, &mut u32>>,
        QueryMarker<Without<f32, &mut u32>>,
    ),
) {
    yaks::batch(&mut context.query(with_f32), entities / 8, |_, unsigned| {
        *unsigned += average.round() as u32;
    });
    yaks::batch(
        &mut context.query(without_f32),
        entities / 8,
        |_entity, unsigned| {
            *unsigned *= average.round() as u32;
        },
    );
}

依赖项

~1.7–2.4MB
~40K SLoC