固定时间步长
可参考的官方例子:
fixed_timestep
.
如果你需要在固定的时间间隔内做一些事情(一个常见的用例是物理状态更新),你可以使用 Bevy 的 FixedTimestep
Run Criteria 将相应的 systems 添加到你的应用程序中。
use bevy::core::FixedTimestep;
// The timestep says how many times to run the SystemSet every second
// For TIMESTEP_1, it's once every second
// For TIMESTEP_2, it's twice every second
const TIMESTEP_1_PER_SECOND: f64 = 60.0 / 60.0;
const TIMESTEP_2_PER_SECOND: f64 = 30.0 / 60.0;
fn main() {
App::new()
.add_plugins(DefaultPlugins)
.add_system_set(
SystemSet::new()
// This prints out "hello world" once every second
.with_run_criteria(FixedTimestep::step(TIMESTEP_1_PER_SECOND))
.with_system(slow_timestep)
)
.add_system_set(
SystemSet::new()
// This prints out "goodbye world" twice every second
.with_run_criteria(FixedTimestep::step(TIMESTEP_2_PER_SECOND))
.with_system(fast_timestep)
)
.run();
}
fn slow_timestep() {
println!("hello world");
}
fn fast_timestep() {
println!("goodbye world");
}
状态
你可以通过访问 FixedTimesteps
resource 来检查固定时间步长跟踪器的当前状态。这可以让你知道离下一次触发还有多少时间,或者它已经越界了多少时长时间。你需要给你的固定时间步长使用 标签
。
请查看这个官方例子对这一点的体现与说明。
注意事项
由于这个功能是用 Run Criteria 实现的,这些 systems 仍然与所有正常系统一起作为帧刷新生命周期的一部分被调用,时间并不精确。
FixedTimestep
Run Criteria 只是检查自上次运行你的系统以来经过了多少时间,并决定是否在当前帧内运行它们,或者根据需要多次运行它们。
危险! 事件丢失!
默认情况下,Bevy 的 事件 是 不可靠的! 事件只持续 2 帧,之后就会丢掉。如果你在你的固定时间步长系统接收事件,请注意,如果帧速率高于固定时间步长的 2 倍,你可能会错过一些事件。
解决这个问题的一个办法是使用 手动清除的事件。这可以让你控制事件的持续时间,但如果你忘记清除它们,将会导致内存泄漏和浪费。