Un loop di gioco dovrebbe essere basato su intervalli di tempo fissi o variabili? Uno è sempre superiore o la scelta giusta varia a seconda del gioco?
Passo temporale variabile
Gli aggiornamenti di fisica vengono passati un argomento "tempo trascorso dall'ultimo aggiornamento" e sono quindi dipendenti da framerate. Questo può significare fare calcoli come position += distancePerSecond * timeElapsed
.
Pro : liscio, più facile da codificare
Contro : non deterministico, imprevedibile a passi molto piccoli o grandi
esempio deWiTTERS :
while( game_is_running ) {
prev_frame_tick = curr_frame_tick;
curr_frame_tick = GetTickCount();
update( curr_frame_tick - prev_frame_tick );
render();
}
Passo temporale fisso
Gli aggiornamenti potrebbero anche non accettare un "tempo trascorso", poiché presumono che ogni aggiornamento sia per un periodo di tempo fisso. I calcoli possono essere eseguiti come position += distancePerUpdate
. L'esempio include un'interpolazione durante il rendering.
Pro : prevedibile, deterministico (più facile da sincronizzare in rete?), Codice di calcolo più chiaro
Contro : non sincronizzato per monitorare la v-sync (causa grafica nervosa a meno che non si interpoli), frame rate massimo limitato (a meno che non si interpoli), difficile lavorare all'interno di framework che assumere fasi temporali variabili (come Pyglet o Flixel )
esempio 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 );
}
Alcune risorse
- Gaffer sui giochi: correggi il tuo timestep!
- L'articolo del loop di gioco di deWitter
- L'FPS di Quake 3 influisce sulla fisica dei salti: illegalmente un motivo per cui Doom 3 è bloccato a 60 fps?
- Flixel richiede un timestep variabile (penso che questo sia determinato da Flash) mentre Flashpunk consente entrambi i tipi.
- Manuale di Box2D § La simulazione del mondo di Box2D suggerisce che utilizza passi temporali costanti.