3个不稳定版本

0.2.1 2022年4月22日
0.2.0 2022年2月25日
0.1.0 2022年2月7日

游戏开发 中排名第 586

每月下载量 23

MIT/Apache

87KB
1K SLoC

cosync

docs.rs Crates.io Crates.io

这个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_stallrun_blocking。你通常想使用run_until_stall,它尝试处理尽可能多的队列,直到无法处理(即,未来返回 Poll::Pending),此时控制权返回给调用者。

创建新任务有三种方法。首先,Cosync结构体本身有一个queue方法。其次,每个任务都有一个CosyncInput<T>作为参数,它具有get(获取对&mut T的访问)和queue(将另一个任务排队,该任务在队列末尾,不一定是在添加它的任务之后)。最后,您可以使用Cosync::create_queue_handle创建一个CosyncQueueHandle,它是Send的,并且可以提供给其他线程以创建新的Cosync任务。

此crate只依赖于std。它处于开发初期阶段,但目前处于生产就绪状态。

没有运行时依赖