3个不稳定版本
0.2.1 | 2022年4月22日 |
---|---|
0.2.0 | 2022年2月25日 |
0.1.0 | 2022年2月7日 |
在 游戏开发 中排名第 586
每月下载量 23 次
87KB
1K SLoC
cosync
这个crate提供了一个单线程、顺序、参数化的异步运行时。换句话说,它创建协程,专门针对视频游戏逻辑,尽管cosync
也适合创建任何需要花费时间的指令序列。
这是一个基本的Cosync
示例
use cosync::{Cosync, CosyncInput};
fn main() {
// the type parameter is the *value* which other functions will get.
let mut cosync: Cosync<i32> = Cosync::new();
let example_move = 20;
// there are a few ways to queue tasks, but here's a simple one:
cosync.queue(move |mut input: CosyncInput<i32>| async move {
// set our input to `example_move`...
*input.get() = example_move;
});
let mut value = 0;
cosync.run_until_stall(&mut value);
// okay, we ran our future, and since it has no awaits, we know
// it will have completed!
assert_eq!(value, example_move);
}
此外,Cosync
可以处理未指定大小的T,包括动态调度
use cosync::Cosync;
// unsized type
let mut cosync: Cosync<str> = Cosync::new();
cosync.queue(|mut input| async move {
let input_guard = input.get();
let inner_str: &str = &input_guard;
println!("inner str = {}", inner_str);
});
// dynamic dispatch
trait DynDispatch {
fn test(&self);
}
let mut cosync_dyn: Cosync<dyn DynDispatch> = Cosync::new();
cosync_dyn.queue(|mut input| async move {
let inner: &mut dyn DynDispatch = &mut *input.get();
});
Cosync
不是 多线程的,也不是并行的——它是完全顺序执行的。将其视为一种表达需要多个阶段和时间来完成,希望稍后执行的代码的有用方式。移动相机、安排演员和执行动画通常与Cosync
配合良好。加载资源文件、进行数学计算或执行I/O应该通过更易多线程的运行时,如switchyard。
此crate公开了两种驱动运行时的方法:run_until_stall
和 run_blocking
。你通常想使用run_until_stall
,它尝试处理尽可能多的队列,直到无法处理(即,未来返回 Poll::Pending
),此时控制权返回给调用者。
创建新任务有三种方法。首先,Cosync
结构体本身有一个queue
方法。其次,每个任务都有一个CosyncInput<T>
作为参数,它具有get
(获取对&mut T
的访问)和queue
(将另一个任务排队,该任务在队列末尾,不一定是在添加它的任务之后)。最后,您可以使用Cosync::create_queue_handle
创建一个CosyncQueueHandle
,它是Send
的,并且可以提供给其他线程以创建新的Cosync
任务。
此crate只依赖于std
。它处于开发初期阶段,但目前处于生产就绪状态。