Javascript - Können nicht Einstellen, FrameRate - requestanimationframe
Starte ich die Schleife
function gameLoop(){
update();
draw();
requestAnimFrame(gameLoop);
}
var requestAnimFrame = window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.oRequestAnimationFrame ||
window.msRequestAnimationFrame ||
function(callback) {
window.setTimeout(callback, 1000 / 1);
};
- Kann ich nicht einstellen, die frame-rate. Es ist immer sehr schnell. Warum kann ich nicht ändern es auf 1 frame die Sekunde. Ich will dies tun, nur für Testzwecke.
- Muss ich deaktivieren Sie die Leinwand jedes mal? Es scheint zu funktionieren gut, ohne es deaktivieren.
Dank.
Hier ist ein link zu einer Geige für den vollständigen code:
vollständige code
Dank
Du musst angemeldet sein, um einen Kommentar abzugeben.
rAF ist gesperrt monitor sync, in der Regel 60 Hz, so können wir nicht einstellen, die FPS für es in sich (browser möglicherweise reduzieren FPS wenn der tab inaktiv ist oder auf Batterien).
Auch, was Sie versuchen, zu ändern, ist der fallback für den poly-fill; das ist: wenn rAF nicht unterstützt wird im browser stattdessen
setTimeout
. Jedoch, die meisten Browser heutzutage tun Unterstützung rAF (auch un-Präfix), so dass diesetTimeout
nie verwendet werden.Können Sie zwei Dinge tun:
setTimeout
direkt (beim testen)Beispiel:
Beispiel:
GEÄNDERT FIDDLE HIER
Gibt es wahrscheinlich bessere Wege zur Umsetzung Drosselung, aber ich bin versucht, nur zeigt das grundlegende Prinzip. Dies wird noch auf vollen Touren laufen, 60 FPS, aber dein code wird minimal von Operationen und nur, wenn der Zähler erreicht hat, bei der Anzahl wird es führen Sie die Haupt-code.
Müssen Sie nicht deaktivieren Sie die Leinwand, jedes mal, wenn das, was Sie zeichnen, wird der nächste Abdeckung die zuvor erstellten Inhalte, oder wenn Sie wollen, halten Sie es natürlich. Sie können auch löschen Sie einen Teil weiter zu optimieren, falls erforderlich.
Etwas spät zur party, aber hier ist, wie man den nutzen von RAF, während auch die Steuerung frames/Sekunde.
Hinweis: requestAnimationFrame hat jetzt einen besseren Weg, Dinge zu tun, als mit dem code-Muster in meinem ursprünglichen 3 Jahre alte original Antwort ... siehe mein update unten für die neuen und verbesserten Weg.
[Update: requestAnimationFrame hat jetzt einen besseren Weg der Drosselung]
Die neue version von
requestAnimationFrame
jetzt sendet automatisch in einen aktuellen Zeitstempel, die Sie verwenden können, um die Drosselklappe Ihre Codes.Hier ist der Beispiel-code ausführen der code alle 1000ms:
}
requestAnimationFrame
sendet automatisch in ein timestamp, also diesetTimeout
ist nicht mehr erforderlich. Anhand des Zeitstempels der Drosselklappe die animation.Sollte man an diesem Artikel sehen, das gibt eine ordentliche Behandlung des Themas.
http://creativejs.com/resources/requestanimationframe/
Hier ist der code ich denke, Sie wollen, aber im ursprünglichen Artikel hieß es requestAnimationFrame verwendet, aber hier bin ich mit requestAnimFrame. Ich denke, vielleicht ist es geändert und man soll requestAnimFrame jetzt. requestAnimationFrame nicht für mich arbeiten, während requestAnimFrame haben.
Den Weg Browsern und javascript arbeiten, macht es schwierig, eine Feste frame-rate. Sagen Sie, Sie wollen etwas tun, jeder zweite, wie die Aktualisierung und Zeichnung. Ein Weg könnte sein, rufen Sie
window.setTimeout()
mit einer Einstellung von einer Sekunde. Aber das problem ist, dass dies nicht zuverlässig, auch wenn Sie konfigurieren einen Rückruf jede Sekunde, die Sie können nicht sicher sein, dass alle Rückrufe werden in der Zeit. Eine hohe Prozessor-Last, zum Beispiel, könnte die Rückrufe kommen sehr viel später als Sie sollte. Und auch wenn die Rückrufe wäre an der Zeit, Sie haben keine Kontrolle über, wenn die eigentliche Zeichnung auf dem Bildschirm passieren wird.Einen besseren Umgang damit zu finden ist, die Tatsache zu akzeptieren, dass Sie nicht bekommen kann eine sehr genaue timing-rufe, und statt dessen immer, wenn Sie einen Anruf erhalten, berechnen Sie, wie viel Zeit vergangen ist, und handeln entsprechend. Dies bedeutet, dass Sie lassen Sie das system entscheiden, das die frame-rate, und Sie kümmern sich um die Aktualisierung Ihrer animation oder Spiel, je nachdem, wie viel Zeit ist vergangen.
requestAnimationFrame ist eine neuere Funktionen von den meisten Browsern unterstützt durch nun, das ist besonders nützlich für Spiele. Es wird jedesmal aufgerufen, wenn der browser bereit ist zu ziehen, das ist gut. Dann werden Sie wissen, dass die updates und zeichnen Sie tun, passieren wird unmittelbar vor dem aktuellen frame auf den Bildschirm gezeichnet.
Hier ist ein Beispiel, wie Sie aktualisieren Sie Ihre gameLoop die Zeit zu nehmen, den Unterschied zu berücksichtigen.
So
requestAnimationFrame
funktioniert. Wenn Sie möchten, dass eine bestimmte framerate, verwenden SiesetTimeout
nur.In der Regel würden Sie ein parameter, der die aktuelle Uhrzeit an. Vergleichen Sie es mit dem letzten Bild ist an der Zeit, um herauszufinden, wie weit die animation bewegen soll.
Ganz praktisch, js library, wenn Sie die Kontrolle über Framrate in javascript
https://github.com/aaronGoshine/Javascript-OnEnterFrame-Event-Manager/blob/master/index.html
requestAnimationFrame
wird mit der maximal erreichbaren Bildrate (bis zu 60 fps). Dies ist, weil es immer geben, Sie die nächste animation frame.Des Parameters, den Sie eingestellt ist nur für die polyfill, die aktiv werden, wenn Ihr browser hat keine Implementierung von
requestAnimationFrame
.Wenn Sie möchten, um zu versuchen Malerei eine Sekunde zu Testzwecken versuchen
setInterval
statt.