考虑这样的游戏循环:
while (gamerunning) {
if (it is time to update physics)
update(fixedTickDuration);
alpha = percent of tick elapsed;
draw(alpha);
}
更新功能根据对象的速度等移动对象,目前还进行碰撞处理。draw函数在先前实体状态和当前实体状态之间进行插值,以绘制中间表示。它总是落后一帧。
问题:我们是否应该使用实体插值坐标在绘图函数中进行碰撞检测和处理?draw函数中的这种处理可能会进一步改变将要绘制的内容。
不,原因有几个,主要是你不想依赖渲染速度来更新游戏。您可以将游戏更新帧速率固定为适当的帧速率,并允许渲染率根据处理环境而变化(根据功能的不同而更快或更慢)。
独立于可变FPS的恒定游戏速度示例:
while( game_is_running ) {
loops = 0;
while( GetTickCount() > next_game_tick && loops < MAX_FRAMESKIP) {
update_game();
next_game_tick += SKIP_TICKS;
loops++;
}
interpolation = float( GetTickCount() + SKIP_TICKS - next_game_tick )
/ float( SKIP_TICKS );
display_game( interpolation );
}
来自这个非常好的游戏循环注意事项概述的代码:
http://www.koonsolo.com/news/dewitters-gameloop/