Myślę ze uda ci się samemu poszperać w necie. Pętla do tworzenia gier którą można zrobić w JS za pomocą requestAnimationFrame nazywana jest "pętlą czasu rzeczywistego" a najbardziej popularną techniką jest wyliczanie delta time czyli różnicy w czasie między końcem poprzedniej klatki a nową klatką.
Gdy masz już delta time to robisz sobie licznik który będzie co klatka dodawał sobie delta time do siebie. Następnie robisz warunek (pętla while) jeśli ten licznik jest większy od interesującego cie czasu to wykonuj daną operacje i odejmuj interesujący cie czas dopóki warunek będzie spełniony. Wówczas gdy FPSy będą trzymać poziom pętla z warunkiem wykona się raz na klatkę jeśli nie wykona sie dwa razy tak chyba najłatwiej to obejść. Dobrym podejściem jest dzielenie klatki na funkcje update oraz draw. Wówczas podwójne obliczanie występować powinno tylko w funkcji update przed wyświetleniem czegokolwiek.
Znalazłem kod który powinien cie interesować :
var now, dt,
last = timestamp();
function frame() {
now = timestamp();
dt = (now - last) / 1000; // duration in seconds
update(dt);
render(dt);
last = now;
requestAnimationFrame(frame);
}
requestAnimationFrame(frame);
Cały artykuł https://codeincomplete.com/posts/javascript-game-foundations-the-game-loop/