Gibt es in JavaScript eine Alternative zum Abrufen der Zeit in Millisekunden mithilfe des Datumsobjekts oder zumindest eine Möglichkeit, dieses Objekt wiederzuverwenden, ohne jedes Mal ein neues Objekt instanziieren zu müssen, wenn ich diesen Wert abrufen muss? Ich frage dies, weil ich versuche, eine einfache Spiel-Engine in JavaScript zu erstellen, und wenn ich die "Delta-Frame-Zeit" berechne, muss ich in jedem Frame ein neues Date-Objekt erstellen. Ich bin zwar nicht allzu besorgt über die Auswirkungen auf die Leistung, habe jedoch einige Probleme mit der Zuverlässigkeit der genauen Zeit, die von diesem Objekt zurückgegeben wird.
Ich bekomme jede Sekunde oder so ein seltsames "Springen" in der Animation und bin mir nicht sicher, ob dies mit der Garbage Collection von JavaScript oder einer Einschränkung des Date-Objekts zusammenhängt, wenn ich so schnell aktualisiere. Wenn ich den Delta-Wert auf eine Konstante setze, ist die Animation perfekt glatt, sodass ich ziemlich sicher bin, dass dieses "Springen" mit der Art und Weise zusammenhängt, wie ich die Zeit bekomme.
Der einzige relevante Code, den ich geben kann, ist die Art und Weise, wie ich die Deltazeit berechne:
prevTime = curTime;
curTime = (new Date()).getTime();
deltaTime = curTime - prevTime;
Bei der Berechnung von Bewegung / Animation multipliziere ich einen konstanten Wert mit der Deltazeit.
Wenn es nicht möglich ist, die Zeit in Millisekunden mithilfe des Date-Objekts zu ermitteln, wird eine Funktion verwendet, die eine Variable inkrementiert (dh die seit Beginn des Spiels verstrichene Zeit in Millisekunden) und die mit der SetTimer-Funktion mit einer Geschwindigkeit von aufgerufen wird einmal alle Millisekunden eine effiziente und zuverlässige Alternative sein?
Bearbeiten: Ich habe jetzt meinen Code in verschiedenen Browsern getestet und es scheint, dass dieser "Sprung" wirklich nur in Chrome sichtbar ist, nicht in Firefox. Aber es wäre trotzdem schön, wenn es eine Methode gäbe, die in beiden Browsern funktioniert.
quelle
Date.getMilliseconds
nur die Millisekunden in der aktuellen Sekunde zurückgegeben werden, dh 0 bis 999? Sie verwenden diese Funktion in Ihrem Beispiel nicht, aber vielleicht wird sie woanders oder in einem anderen Zweig verwendet?Antworten:
Versuchen Sie Date.now () .
Das Überspringen ist höchstwahrscheinlich auf die Speicherbereinigung zurückzuführen. Normalerweise kann die Speicherbereinigung vermieden werden, indem Variablen so weit wie möglich wiederverwendet werden. Ich kann jedoch nicht genau sagen, mit welchen Methoden Sie die Pausen für die Speicherbereinigung reduzieren können.
quelle
Ich weiß, dass dies ein ziemlich alter Thread ist, aber um die Dinge auf dem neuesten Stand und relevanter zu halten, können Sie die genauere
performance.now()
Funktionalität verwenden, um ein feineres Korn-Timing in Javascript zu erzielen.quelle
Date.now
anstelle eines anonymen Funktionsausdrucks seinperformance.now()
Gegensatz zu der Zeit von monotone Zeit gibtDate
. Dies bedeutet, dass bei jedem nachfolgenden Anruf garantiert ein Wert zurückgegeben wird, der nicht kleiner als der vorherige ist.Soweit ich weiß, kann man mit Date nur Zeit bekommen .
Date.now ist die Lösung, aber nicht überall verfügbar: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/now .
Dies gibt Ihnen die aktuelle Zeit in Millisekunden.
Für deine Sprünge . Wenn Sie Interpolationen gemäß der Delta-Frame-Zeit korrekt berechnen und keinen Rundungszahlenfehler haben , wette ich für den Garbage Collector (GC).
Wenn sich in Ihrer Schleife viele temporäre Objekte befinden, muss die Garbage Collection den Thread sperren, um eine Bereinigung und eine Neuorganisation des Speichers durchzuführen.
Mit Chrome können Sie im Zeitleistenfenster sehen, wie viel Zeit der GC verbringt .
EDIT: Da meine Antwort,
Date.now()
sollte als die beste Option angesehen werden, da es überall und auf IE> = 9 unterstützt wird.quelle
+
dienen+new
?+
einfach warfDate
aufNumber
, einen Standard - Unix - Zeitstempel in Millisekunden zu geben. Sie können diesen Wert explizit erhalten, indem Sie(new Date()).getTime()
Date.now()
wird jetzt bevorzugt, da seine Unterstützung jetzt groß genug ist.+
als.getTime()
... Es ist einfacher und ich muss mir keine Funktionsnamen merkenWenn Sie ein Datumsobjekt wie haben
Dann gibt es eine eingebaute Methode in Javascript, um das Datum im Millisekundenformat abzurufen, das valueOf () ist.
quelle
Dies ist eine sehr alte Frage - aber immer noch als Referenz, wenn andere sie betrachten -
requestAnimationFrame()
ist der richtige Weg, um mit Animationen in modernen Browsern umzugehen:UPDATE: Der Mozilla-Link zeigt, wie das geht - ich hatte keine Lust, den Text hinter dem Link zu wiederholen;)
quelle
requestAnimationFrame
, was dieses "Springen" stoppt, wie in der Frage beschrieben. Vielen Dank!