yaks
![Latest Version] ![Documentation] ![License]
yaks
aims to be a minimalistic and performant framework for automatic
multithreading of [hecs
] via [rayon
].
The goals are, in no particular order: - safety - simplicity - performance - extensibility - tight engineering - minimal dependencies - effortless concurrency
parallel
- enabled by default; can be disabled to force yaks
to work on a single thread.
Useful for writing the code once, and running it on platforms with or without threading.test
- if enabled, turns off an internal drop check. Useful to prevent panic while
panicking when automatically testing panic conditions.A more elaborate and annotated example can be found here.
```rust use hecs::{With, Without, World}; use yaks::{Executor, QueryMarker};
fn main() { let mut world = World::new(); let mut entities = 0u32; world.spawnbatch((0..100u32).map(|index| { entities += 1; (index,) })); world.spawnbatch((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() .systemwithhandle( |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", ) .systemwithhandle( |context, increment: &usize, query: QueryMarker<&mut u32>| { for (entity, unsigned) in context.query(query).iter() { *unsigned += *increment as u32 } }, "increment", ) .systemwithdeps(systemwithtwo_queries, vec!["increment", "average"]) .build(); executor.run(&world, (&mut entities, &mut increment, &mut average)); }
fn systemwithtwoqueries(
context: yaks::SystemContext,
(entities, average): (&u32, &f32),
(withf32, withoutf32): (
QueryMarker