¿Debe un bucle de juego basarse en pasos de tiempo fijos o variables? ¿Uno siempre es superior o la elección correcta varía según el juego?
Paso de tiempo variable
Las actualizaciones de física pasan un argumento de "tiempo transcurrido desde la última actualización" y, por lo tanto, dependen de la velocidad de fotogramas. Esto puede significar hacer cálculos como position += distancePerSecond * timeElapsed
.
Pros : suave, más fácil de codificar
Contras : no determinista, impredecible en pasos muy pequeños o grandes
deWiTTERS ejemplo:
while( game_is_running ) {
prev_frame_tick = curr_frame_tick;
curr_frame_tick = GetTickCount();
update( curr_frame_tick - prev_frame_tick );
render();
}
Paso de tiempo fijo
Es posible que las actualizaciones ni siquiera acepten un "tiempo transcurrido", ya que suponen que cada actualización es por un período de tiempo fijo. Los cálculos pueden hacerse como position += distancePerUpdate
. El ejemplo incluye una interpolación durante el render.
Pros : predecible, determinista (¿más fácil de sincronizar en red?), Código de cálculo más claro
Contras : no sincronizado para monitorear la sincronización en v (causa gráficos nerviosos a menos que interpoles), velocidad de fotogramas máxima limitada (a menos que interpoles), difícil de trabajar dentro de marcos que asumir pasos de tiempo variable (como Pyglet o Flixel )
deWiTTERS ejemplo:
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 );
}
Algunos recursos
- Gaffer en juegos: ¡arregla tu paso de tiempo!
- Artículo del bucle del juego de deWitter
- El FPS de Quake 3 afecta la física del salto, ¿sin duda una razón por la cual Doom 3 está bloqueado a 60 fps?
- Flixel requiere un paso de tiempo variable (creo que esto lo determina Flash), mientras que Flashpunk permite ambos tipos.
- Manual de Box2D § Simulando el mundo de Box2D sugiere que use pasos de tiempo constante.