2 个不稳定版本
0.1.0 | 2020年6月6日 |
---|---|
0.0.0-alpha1 | 2020年1月14日 |
在 并发 中排名 491
93KB
1.5K SLoC
yaks
yaks
旨在通过 rayon
为 hecs
提供一个最小化且性能卓越的自动多线程框架。
目标是,不分先后顺序
- 安全性
- 简洁性
- 性能
- 可扩展性
- 紧密工程
- 最小化依赖
- 轻松实现并发
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