Latest commit d7a897d

系统链接

相关的官方文档:[system_chaining]


多个 Rust 函数可以组成一个 Bevy 系统。

定义多个有输入有输出的函数,把它们连接在一起,当成一个系统来运行。

这就是“系统链接”。请注意区别:不是创建“多个系统”以链的顺序执行,而是创建“一个系统”执行“多个 Rust 函数”。

系统链接不是用于系统之间的通信,请用用事件来通信。


好的应用程序能够从系统中返回错误(允许使用 Rust 的 ? 操作符)并在合适的地方处理错误:

#![allow(unused)]
fn main() {
fn net_receive(mut netcode: ResMut<MyNetProto>) -> std::io::Result<()> {
    netcode.receive_update()?;

    Ok();
}

fn handle_io_errors(In(result): In<std::io::Result<()>>) {
    if let Err(e) = result {
        eprintln!("I/O error occurred: {}", e);
    }
}
}

上面的系统不能单独注册(Bevy 不知道怎样这些系统的处理输入和输出),必须组合成系统链:

fn main() {
    App::new()
        // ...
        .add_system(net_receive.chain(handle_io_errors))
        // ...
        .run();
}

性能警告

Bevy 把整个链条当成一个大的系统,所有的资源和查询都组合在一起,这意味着并行性可能受到限制,影响性能。

todo:这句不理解,影响链内还是另一条链? 不要把需要可变访问的系统添加进链条,否则会阻止所有受影响的链的并行运行。