2014-01-23 103 views
4

我一直認爲requestAnimationFrame使用的時間戳與JavaScript中的通常時間戳相同,即1970年1月1日以來的毫秒數。今天,我捕獲了時間戳以驗證並發現RAF時間戳可能是從頁面加載開始。時間戳的準確度是什麼?requestAnimationFrame:什麼是時間戳?

測試代碼:

<p id="output"></p> 

var i = 0; 
var start = null; 
var times = []; 
var dur = 5000; 

function step(timestamp) { 
if (start===null) start = timestamp; 
times[i++] = timestamp; 
if (timestamp-start<=dur) { 
    requestAnimationFrame(step); 
} else { 
    document.getElementById('output').innerHTML = times.join('<br>'); 
} 
} 

requestAnimationFrame(step); 

給出的結果是這樣的:

158.52126457412882 
183.12243595205535 
199.52116819316421 
... 
在所有RAF功能的瀏覽器

+0

從[文檔](https://developer.mozilla.org/en-US/docs/Web/API/window.requestAnimationFrame):「該回調函數有一個參數,[DOMHighResTimeStamp'](https ://developer.mozilla.org/en-US/docs/Web/API/DOMHighResTimeStamp),它表示requestAnimationFrame開始觸發回調的當前時間。「 –

回答

7

這是一個DOMHighResTimeStamp或高分辨率時間戳(與window.performance.now()一樣)。

時間戳是:

當前時間時requestAnimationFrame開始火回調。

普通時間戳和高分辨率時間戳之間的主要區別是:

DOMTimeStamp只有毫秒精度,但DOMHighResTimeStamp 具有十微秒的最小精度。

注意:有些瀏覽器不實現這個方面的RAF,可能會給你錯誤或沒有價值的參數。

一些資源:

+0

「在使用rAF的情況下,從rAF開始計數,第一個時間戳可能爲空。」這不是真的。嘗試在RAF的第一次通話之前添加警報('已暫停')。警告塊腳本,如果您在5秒後點擊它,times數組中的第一個值大約是5000 ... –

+0

@LeosOndra請參閱更新(我有更多錯誤的實現 - 重寫) – K3N