游戏循环应该基于固定时间段还是可变时间段?一个人永远是上等的,还是正确的选择会因游戏而异?
可变时间步长
物理更新传递了“自上次更新以来经过的时间”参数,因此与帧速率有关。这可能意味着要进行计算position += distancePerSecond * timeElapsed
。
优点:流畅,更易于编码
缺点:不确定性,无论步长或步长都是不确定的
deWiTTERS示例:
while( game_is_running ) {
prev_frame_tick = curr_frame_tick;
curr_frame_tick = GetTickCount();
update( curr_frame_tick - prev_frame_tick );
render();
}
固定时间步
更新可能甚至不接受“经过的时间”,因为它们假定每次更新都是在固定的时间段内进行的。计算可以按进行position += distancePerUpdate
。该示例包括渲染期间的插值。
优点:可预测,确定性(更容易进行网络同步?),更清晰的计算代码
缺点:不同步以监控垂直同步(除非进行插值,否则会引起抖动的图形),最大帧速率受限(除非进行插值),难以在框架内工作采取可变的时间步长(例如Pyglet或Flixel)
deWiTTERS示例:
while( game_is_running ) {
while( GetTickCount() > next_game_tick ) {
update();
next_game_tick += SKIP_TICKS;
}
interpolation = float( GetTickCount() + SKIP_TICKS - next_game_tick )
/ float( SKIP_TICKS );
render( interpolation );
}
一些资源
- 游戏管理员:修正您的时间步伐!
- deWitter的游戏循环文章
- 雷神之锤3的FPS影响跳跃物理效果-可能是《毁灭战士3》被帧锁定为60fps的原因吗?
- Flixel需要可变的时间步长(我认为这由Flash确定),而Flashpunk允许两种类型。
- Box2D的手册§ 模拟 Box2D的世界表明,它使用恒定的时间步长。