2013-02-21 11 views
5

È possibile misurare intervalli di tempo inferiori a 1 millisecondo supportati in tutti i browser che conosco solo in un modo in Chrome.calcolo FPS in Javascript inferiore a 1 millisecondo

Il metodo di cromo: window.performance.now()

Attualmente mi fare misurazioni FPS in spazi di tempo millisecondi, ma se inferiore a 1ms passaggi che ricevo all'infinito, perché i due numeri sono arrotondati al millisecondo più vicino in modo che siano lo stesso valore.

Qualcuno sa che una funzione crossbrowser calcola meno di 1 millisecondo intervallo di tempo in javascript?

+1

JavaScript (attualmente) privo di timer sub-millisecondo. –

+0

Direi di no, dato che l'oggetto Date funziona con millisecondi al livello più basso, ma fammi sapere se no. – philipp

+0

possibile duplicato di [javascript fornisce un timer ad alta risoluzione?] (Http: // stackoverflow.it/questions/6875625/does-javascript-provide-a-high-resolution-timer) – Bergi

risposta

3

Ecco come ottenere misurazioni accurate senza un timer preciso, a patto che ciò che si sta verificando spesso, che spero facciano nel tuo caso.

Media/aggrega le misurazioni imprecise della durata del tuo evento. Un frammento di uno dei miei progetti:

 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; 
     } 

Ogni nuove misure di valore trilli la vostra lettura più vicino ad esso di un fattore di 0,02. Ovviamente vorrai modificarlo un po '. Ciò ti consentirà di leggere una media che si aggira intorno a 0,5 ms se leggi una durata di 1 ms metà tempo e 0 ms metà tempo (con un timer con risoluzione 1ms).

Questo ovviamente non sostituisce un timer con risoluzione più elevata. Ma io uso questo semplice algoritmo per dare ai miei progetti javascript una lettura FPS non schifosa. Si ottiene un fattore di smorzamento che è possibile modificare a seconda se si desidera una maggiore precisione o una risposta più immediata alle modifiche. Considerando la semplicità di questo, è difficile trovare un algoritmo più elegante per fornire una buona rappresentazione senza dati di input migliorati. Uno dei modi per migliorarlo sarebbe quello di regolare il fattore di approccio (quella costante di 0,02) in base alla frequenza del campionamento stesso (se questo cambia), in questo modo potrebbe essere fatto un tasso misurato più lento per convergere più rapidamente rispetto a un valore fisso .

0

High resolution time is available in Chrome 20, ma si dovrebbe essere consapevoli del fatto che time resolution in JS depends on the browser, device and circumstances. Potrebbe variare tra 4ms e 1000 + ms

+0

Pensi che la seconda affermazione sia ancora valida? L'articolo è stato pubblicato sul blog nel 2008. – Bergi

+0

@Bergi buon punto sull'articolo del 2008, ho fatto una rapida ricerca e ci sono anche un paio di articoli dal 2010 e 2011 sullo stesso problema, quindi penso che la dichiarazione sia ancora valida. – valentinas

+1

Ad esempio questo articolo: http://www.headlondon.com/our-thoughts/technology/posts/the-accuracy-of-javascript-timing – valentinas

1

C'è in realtà un altro modo per calcolare il fps, che può essere un modo per aggirare questo problema. È a contare il numero effettivo di frame in un secondo, che dovrebbe essere essere abbastanza preciso, penso.

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. appena digitato qui, non testato, potrebbe richiedere lievi modifiche.

Ricordo di aver visto un modo come questo in esercitazione lwjgl ...

anche come notato da @StevenLu, è possibile modificarlo per contare il numero di fotogrammi in 0,5 secondi e moltiplicare il "fps" di due, o ancora meno tempo (es. 0,25 secondi) in modo che l'aggiornamento del valore fps sia più frequente.

+0

Questa è anche una soluzione solida per il problema. Questo fa più di un calcolo FPS diretto registrando letteralmente il conteggio su un secondo reale effettivo, quindi fornirà un valore intero per te che potrebbe essere più utile di un risultato in virgola mobile astratto. La debolezza di questo metodo è nell'accuratezza della misurazione delle basse frequenze (una lettura a 0,5 fps usando questo metodo ti darebbe una lettura che si alterna tra la lettura di 1fps e 0fps dove il mio metodo ti mostrerà 0.5, ma il mio impiegherebbe molto tempo per convergere! –

+0

Ricorderò anche che questo algoritmo ha anche un comodo parametro modificabile che è la frequenza di campionamento, quindi è possibile ad esempio contare il numero di frame su 0,5 secondi e raddoppiare quel numero per produrre una lettura FPS. Questo avrebbe la metà della precisione ma il doppio della reattività. –

Problemi correlati