Ten moduł implementuje pętlę gry o stałym kroku czasowym z użyciem requestAnimationFrame, z obsługą:
delta timealphaJest często używany w grach i symulacjach, gdzie wymagane są stabilne aktualizacje fizyki niezależnie od wahań liczby klatek.
Creation → Start → Update/Render Loop → Stop
createLoopstartLooptick zarządzają fazami aktualizacji i renderowaniastopLoopLoopStateReprezentuje wewnętrzny stan pętli.
lastTime: number
Znacznik czasu ostatniej klatki (w milisekundach)
accumulator: number
Czas skumulowany jeszcze nieprzetworzony przez stałe aktualizacje
fixedDelta: number
Stały krok czasowy w sekundach (domyślnie: 1/60)
update(dt: number): void
Funkcja wywoływana w stałych odstępach z dt = fixedDelta
render(alpha: number): void
Funkcja renderująca wywoływana raz na klatkę z czynnikiem interpolacji
running: boolean
Czy pętla jest aktualnie aktywna
frameId: number | null
Bieżące ID requestAnimationFrame
createLoop(update, render, fixedDelta?)Tworzy i zwraca nowy stan pętli.
Parametry
update(dt: number) – funkcja aktualizacji w stałym krokurender(alpha: number) – funkcja renderowania z interpolacjąfixedDelta?: number – krok czasowy w sekundach (domyślnie: 1/60)Zwraca
LoopStatestartLoop(state)Uruchamia pętlę animacji, jeśli nie jest już aktywna.
Zachowanie
running = truerequestAnimationFramestopLoop(state)Zatrzymuje pętlę i anuluje oczekujące klatki animacji.
Zachowanie
running = falsecancelAnimationFrameframeIdtick(state, time)Główna funkcja pętli wykonywana przy każdej klatce animacji.
state.running jest falselastTime = timedelta = (time - lastTime) / 1000
0.25s, aby uniknąć efektu spiral of death przy spadkach wydajnościstate.accumulatorstate.update(fixedDelta) tyle razy, ile potrzeba:
while (accumulator >= fixedDelta)
alpha = accumulator / fixedDelta
state.render(alpha)requestAnimationFrameconst loop = createLoop(
(dt) => {
// aktualizacja fizyki / logiki gry
position += velocity * dt;
},
(alpha) => {
// interpolacja dla płynnego renderowania
renderSprite(position + velocity * alpha);
}
);
startLoop(loop);
// później...
stopLoop(loop);
requestAnimationFrame — API przeglądarki używane do planowania klatek