固定时间步长

可参考的官方例子: 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 倍,你可能会错过一些事件。

解决这个问题的一个办法是使用 手动清除的事件。这可以让你控制事件的持续时间,但如果你忘记清除它们,将会导致内存泄漏和浪费。