Czy pętla gry powinna opierać się na stałych lub zmiennych krokach czasowych? Czy ktoś jest zawsze lepszy, czy właściwy wybór zależy od gry?
Zmienny krok czasowy
Aktualizacje fizyki są przekazywane argumentem „czas, jaki upłynął od ostatniej aktualizacji”, a zatem zależą od liczby klatek na sekundę. Może to oznaczać wykonywanie obliczeń jako position += distancePerSecond * timeElapsed
.
Plusy : płynne, łatwiejsze do kodowania
Wady : niedeterministyczne, nieprzewidywalne przy bardzo małych lub dużych krokach
przykład deWiTERów :
while( game_is_running ) {
prev_frame_tick = curr_frame_tick;
curr_frame_tick = GetTickCount();
update( curr_frame_tick - prev_frame_tick );
render();
}
Naprawiono krok czasowy
Aktualizacje mogą nawet nie zaakceptować „upływu czasu”, ponieważ zakładają, że każda aktualizacja trwa przez określony czas. Obliczenia można wykonać w następujący sposób position += distancePerUpdate
. Przykład obejmuje interpolację podczas renderowania.
Plusy : przewidywalny, deterministyczny (łatwiejszy do synchronizacji z siecią?), Wyraźniejszy kod obliczeniowy
Wady : niezsynchronizowany z monitorem v-sync (powoduje roztrzęsioną grafikę, chyba że interpolujesz), ograniczona maksymalna częstotliwość klatek (chyba, że interpolujesz), ciężko pracować w ramach, które zakładaj zmienne przedziały czasowe (jak Pyglet lub Flixel )
przykład deWiTERów :
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 );
}
Niektóre zasoby
- Gaffer w grach: napraw swój czas!
- Artykuł pętli gry deWitter
- FPS Quake'a 3 wpływa na fizykę skoków - jest to prawdopodobnie powód, dla którego gra Doom 3 ma 60 klatek na sekundę?
- Flixel wymaga zmiennego czasu (myślę, że jest to określane przez Flash), podczas gdy Flashpunk pozwala na oba typy.
- Podręcznik Box2D § Symulacja świata Box2D sugeruje, że używa on stałych kroków czasowych.