什么是FPS

跑官方FPS诊断工具(FrameTimeDiagnosticsPlugin)时, 会看到下面的日志

INFO bevy diagnostic: fps        :   60.051708   (avg 60.014163)
INFO bevy diagnostic: frame_time :   16.654797ms (avg 16.666525ms)
INFO bevy diagnostic: frame_count:  418.000000   (avg 358.500000)

上面的日志的意思是目前Bevy 程序的fps 是60, 每帧耗时 16ms。

fps的意思是帧率(frames per second),即一秒钟跑了几帧(frame/tick, 这里我们先不考虑渲染帧率)。

三种时间

fps和时间严格相关, 而Bevy引擎里有三种时间:

  • 真实时间(Real)
  • 固定时间(Fixed)
  • 虚拟时间(Virtual)

他们的区别如下

真实时间虚拟时间固定时间
时间缩放
暂停
时间间隔1/FPS1/FPS * 缩放比例基于虚拟时间的固定值

例程

参考官方例程写一个例子来说明:

设置初始参数

// 设置固定时间为0.25秒(初始为64hz,或者15625 微秒)
app.insert_resource(Time::<Fixed>::from_seconds(0.25))
 
fn setup(mut commands: Commands, mut time: ResMut<Time<Virtual>>) {  
    // 设置虚拟时间的相对速度为2倍  
    time.set_relative_speed(2.);
}

运行效果

从视频中可以看到当真实时间到16秒时,因为时间缩放比例为2, 所以固定时间和虚拟时间都到了32秒。

固定时间每帧间隔为初始设置的0.25, 虚拟时间的时间间隔为真实时间间隔的2倍为0.031。

当暂停时, 固定时间和虚拟时间的图标都停止了运动,但读取time.delta()时, 虚拟时间已经变为0,但固定时间还是0.25。

总结

真实时间

一些需要实时反馈的系统(system),比如说UI, 或者需要记录真实世界的流逝时间,应该使用Res<Time<Real>>, 真实时间不受暂定、时间缩放和其他的设置影响。

虚拟时间

默认Res<Time> 就是虚拟时间, 会被暂停和时间缩放影响, 两帧时间的间隔受系统影响,可能会不稳定。一般我们游戏计时可以用它,通过时间缩放可以制作子弹时间等特殊效果。

固定时间

游戏中物理模拟、动画更新、AI行为等需要稳定和可预测性的时间依赖的系统,会用到固定时间Res<Time<Fixed>>