2013-02-21 10 views
5

Ist es möglich, Zeitlücken weniger als 1 Millisekunden zu messen, die in allen Browsern unterstützt wird, kenne ich nur eine Möglichkeit, die in Chrome ist.Berechnung FPS in Javascript weniger als 1 Millisekunde

Die Chrom-Methode: window.performance.now()

Derzeit tun i FPS Messungen in Millisekunden-Zeiträumen, aber wenn weniger als 1 ms Pässe bekomme ich unendlich, weil die beiden Zahlen auf die nächste Millisekunde gerundet sind, so dass sie den gleichen Wert.

Kennt jemand eine Cross-Browser-Funktion berechnen weniger als 1 Millisekunde Zeitlücken in Javascript?

+1

JavaScript (derzeit) fehlen Sub-Millisekunden-Timer. –

+0

Ich würde nein, da das Date-Objekt mit Millisekunden auf niedrigster Ebene arbeitet, aber lass es mich wissen, wenn nicht. – philipp

+0

mögliches Duplikat von [Bietet Javascript einen Timer mit hoher Auflösung?] (Http: // stackoverflow.com/questions/6875625/does-javascript-provide-a-high-resolution-timer) – Bergi

Antwort

3

Hier erhalten Sie genaue Messungen ohne einen genauen Timer, solange was Sie Timing häufig auftritt, was ich hoffe, dass sie in Ihrem Fall tun.

Durchschnitt/aggregieren Sie die ungenauen Messungen der Dauer Ihres Ereignisses. Ein Ausschnitt aus einem meiner Projekte:

 var start = Date.now(); 
     ... (stuff to be timed) 
     var now = Date.now(); 

     if (DEBUG.enabled) { 
      var profile_this_iter = now - start; 
      profile += (profile_this_iter - profile) * 0.02; 
     } 

jeden neuen Wert Maßnahmen stupst Ihre Anzeige um einen Faktor von 0,02 bis es näher. Offensichtlich willst du das ein bisschen verbessern. Dies ermöglicht es Ihnen, einen Mittelwert zu lesen, der ungefähr 0,5 ms beträgt, wenn Sie eine Dauer von 1 ms der Hälfte der Zeit und 0 ms der Hälfte der Zeit (mit einem 1 ms Auflösungstimer) lesen.

Dies ist offensichtlich kein Ersatz für einen richtigen Timer mit höherer Auflösung. Aber ich verwende diesen einfachen Algorithmus, um meinen Javascript-Projekten eine nicht-crappy FPS-Lesung zu geben. Sie erhalten einen Dämpfungsfaktor, den Sie anpassen können, je nachdem, ob Sie mehr Genauigkeit oder eine schnellere Reaktion auf Änderungen wünschen. In Anbetracht der Einfachheit dieses Handbuchs wäre es schwierig, einen eleganteren Algorithmus zu finden, der Ihnen eine gute Darstellung ohne verbesserte Eingabedaten bietet. Eine der Möglichkeiten, dies zu verbessern, wäre die Anpassung des Annäherungsfaktors (0,02 konstant) basierend auf der Frequenz der Abtastung selbst (falls sich dies ändert), auf diese Weise könnte eine langsamere gemessene Rate schneller konvergieren als mit einem festen Wert .

0

High resolution time is available in Chrome 20, aber Sie sollten wissen, dass time resolution in JS depends on the browser, device and circumstances. Es kann variieren zwischen 4ms und 1000 + ms

+0

Glauben Sie, dass die zweite Aussage noch gültig ist? Dieser Artikel wurde im Jahr 2008 gebloggt. – Bergi

+0

@Bergi guter Punkt über Artikel aus dem Jahr 2008, habe ich eine schnelle Suche und es gibt ein paar Artikel aus 2010 und 2011 auch über das gleiche Problem, so denke ich, dass die Aussage noch gültig ist. – valentinas

+1

Zum Beispiel diesen Artikel: http://www.headlondon.com/our-thoughts/technology/posts/the-accuracy-of-javascript-timing – valentinas

1

Es gibt tatsächlich eine andere Möglichkeit, die fps zu berechnen, die eine Möglichkeit sein können, um dieses Problem zu umgehen. Es ist zu zählen die tatsächliche Anzahl der Bilder in einer zweiten, die sollte ziemlich genau sein, denke ich.

var fpsStart = new Date().getTime(); 
var fpsCounting = 0; 
var fps = 0; 
start_the_first_frame(); 

// Loop 
function update(){ 
    do_time_consuming_stuff(); 
    fpsCounting++; 
    var thisFrame = new Date().getTime(); 
    if(thisFrame - fpsStart >= 1000){ 
     fpsStart += 1000; 
     fps = fpsCounting; 
     fpsCounting = 0; 
    } 
    request_next_animation_frame(); 
} 

P.S. nur hier eingegeben, nicht getestet, kann geringfügige Änderungen erfordern.

Ich erinnere mich, eine Art und Weise, wie dies in lwjgl Tutorial zu sehen ...

auch, wie durch @StevenLu erwähnt, Sie können es ändern, die Anzahl der Frames in 0,5 Sekunden zu zählen und die „fps“ durch zwei multiplizieren, oder noch kürzere Zeit (zB 0,25 Sekunden), so dass die Aktualisierung des fps-Wertes häufiger ist.

+0

Dies ist auch eine solide Lösung für das Problem. Dies macht eher eine direkte FPS-Berechnung, indem die Zählung buchstäblich über eine tatsächliche reale Sekunde aufgezeichnet wird, so dass sie einen ganzzahligen Wert für Sie bereitstellt, der hilfreicher sein kann als ein abstraktes Gleitkommaergebnis. Die Schwäche dieser Methode liegt in der Genauigkeit der Messung von niedrigen Raten (eine 0,5 fps Lesung mit dieser Methode würde Ihnen einen Messwert geben, der zwischen dem Lesen von 1 fps und 0 fps wechselt, wo meine Methode Ihnen 0,5 zeigt, aber meins würde viel Zeit brauchen, um zu konvergieren!) –

+0

Ich werde auch erwähnen, dass dieser Algorithmus hat auch einen praktischen Tweakable-Parameter, der die Abtastrate ist, so können Sie zum Beispiel die Anzahl der Bilder über 0,5 Sekunden und die doppelte Anzahl zählen, um eine FPS-Lesung zu erzeugen. Dies hätte die halbe Genauigkeit, aber die doppelte Reaktionsfähigkeit. –