Die Art und Weise, wie Browser und JavaScript funktionieren, erschwert die Einrichtung einer festen Bildfrequenz. Nehmen wir an, du möchtest jede Sekunde etwas machen, wie zum Beispiel das Aktualisieren und Zeichnen. Eine Möglichkeit wäre, window.setTimeout()
mit einer Einstellung von einer Sekunde aufzurufen. Aber das Problem ist, dass dies nicht so zuverlässig ist, selbst wenn Sie jede Sekunde einen Callback konfigurieren, können Sie nicht sicher sein, dass alle Callbacks rechtzeitig sind. Eine hohe Prozessorlast beispielsweise könnte dazu führen, dass die Rückrufe viel später ankommen, als sie sollten. Und selbst wenn die Callbacks pünktlich sind, haben Sie keine Kontrolle darüber, wann die eigentliche Zeichnung auf den Bildschirm kommt.
Ein besserer Weg, um es zu handhaben ist, die Tatsache zu akzeptieren, dass Sie nicht ein sehr genaues Timing Ihrer Anrufe erhalten können, und stattdessen, wenn Sie einen Anruf erhalten, berechnen Sie, wie viel Zeit vergangen ist und danach handeln . Das bedeutet, dass Sie das System die Bildrate bestimmen lassen und dass Sie nur Ihre Animation oder Ihr Spiel aktualisieren müssen, je nachdem wie viel Zeit vergangen ist.
requestAnimationFrame ist eine neuere Funktionalität, die von den meisten Browsern inzwischen unterstützt wird und besonders nützlich für Spiele ist. Es wird jedes Mal aufgerufen, wenn der Browser zum Zeichnen bereit ist, was gut ist. Dann werden Sie wissen, dass die Aktualisierungen und die Zeichnung, die Sie gerade ausführen, kurz vor dem eigentlichen Bild auf dem Bildschirm angezeigt werden.
Hier ist ein Beispiel, wie Sie Ihren GameLoop aktualisieren können, um den Zeitunterschied zu berücksichtigen.
Klingt sehr logisch und clever. – nerkn
sollten Sie nicht irgendwie setTimeout und requestAnimationFrame tauschen? In Ihrem Beispiel werden update und draw beim setTimeout-Ereignis aufgerufen, immer noch asynchron, während der gameloop() -Body synchron ist (aber nichts tut, als das Zeitlimit zu setzen) –
@DanielAlder. Dieser Code ist ein paar Jahre alt und jetzt sendet 'requestAnimationFrame' automatisch einen Zeitstempel, so dass 'setTimeout' nicht mehr benötigt wird. Verwenden Sie den Zeitstempel, um die Animation zu drosseln. – markE