8 个版本 (5 个重大更新)
0.6.0 | 2024年3月18日 |
---|---|
0.5.0 | 2023年11月21日 |
0.4.0 | 2023年7月25日 |
0.3.0 | 2023年3月21日 |
0.1.0 | 2023年2月11日 |
#1745 in 游戏开发
每月下载 33 次
在 2 crates 中使用
58KB
1K SLoC
关于
pecs
是 Bevy 的插件,允许您通过链式多个承诺作为 Bevy 的 ecs
环境的一部分来异步执行代码。
pecs
代表 Promise Entity Component System
。
资源
兼容性
bevy | pecs |
---|---|
0.13 | 0.6 |
0.12 | 0.5 |
0.11 | 0.4 |
0.10 | 0.3 |
0.9 | 0.2 |
功能
- 使用
then()
/then_repeat()
进行承诺链式 - 状态传递(承诺的状态类似于项目中的
self
)。 - 完整的类型推断(下一个承诺知道前一个结果的数据类型)。
- 内置定时器、UI 和 HTTP 承诺,通过无状态的
asyn
模块和有状态的state.asyn()
方法。 - 自定义承诺注册(添加您想要的任何异步函数!)。
- 系统参数 获取(承诺
asyn!
函数接受与 Bevy 系统相同的参数)。 - 嵌套承诺(显然通过链式)。
- 通过无状态的
Promise::any(())/Promise::all(())
或有状态的state.any(()) /state.all(())
方法将承诺与any/all
结合,用于处理承诺的元组/vec。 - 通过
with(value) /map(func)
进行状态映射(在链式调用中更改状态类型/值)。 - 通过
with_result(value) /map_result(func)
进行结果映射(在链式调用中更改结果类型/值)。
示例
use bevy::prelude::*;
use pecs::prelude::*;
fn main() {
App::new()
.add_plugins(DefaultPlugins)
.add_plugins(PecsPlugin)
.add_systems(Startup, setup)
.run();
}
fn setup(mut commands: Commands, time: Res<Time>) {
let start = time.elapsed_seconds();
commands
// create PromiseLike chainable commands
// with the current time as state
.promise(|| start)
// will be executed right after current stage
.then(asyn!(state => {
info!("Wait a second..");
state.asyn().timeout(1.0)
}))
// will be executed after in a second after previous call
.then(asyn!(state => {
info!("How large is is the Bevy main web page?");
state.asyn().http().get("https://bevy.rust-lang.net.cn")
}))
// will be executed after request completes
.then(asyn!(state, result => {
match result {
Ok(response) => info!("It is {} bytes!", response.bytes.len()),
Err(err) => info!("Ahhh... something goes wrong: {err}")
}
state.pass()
}))
// will be executed right after the previous one
.then(asyn!(state, time: Res<Time> => {
let duration = time.elapsed_seconds() - state.value;
info!("It took {duration:0.2}s to do this job.");
info!("Exiting now");
asyn::app::exit()
}));
}
以下是上述示例的输出,请注意时间戳
18.667 INFO bevy_render::renderer: AdapterInfo { ... }
18.835 INFO simple: Wait a second..
19.842 INFO simple: How large is is the Bevy main web page?
19.924 INFO simple: It is 17759 bytes!
19.924 INFO simple: It tooks 1.09s to do this job.
19.924 INFO simple: Exiting now
工作正在进行中
这个crate相对较新。API可能会改变。应用可能会崩溃。某些承诺可能会静默丢弃。文档不完整。
但是。但是。示例运行得非常好。这个事实给我们带来了很多希望。
许可证
pecs
双重许可,可以是以下任一
- MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
- Apache 许可证,版本 2.0 (LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
这意味着您可以选择您喜欢的许可证!这种双重许可方法在 Rust 生态系统中被视为标准做法,并且存在非常好的理由来包含两者。
lib.rs
:
Promise
的核心功能。
依赖关系
~20–47MB
~748K SLoC