2015-12-29 119 views
1

的JavaScript,requestAnimationFrame:JS requestAnimationFrame幀速率

你知道幀速率在不同情況下如何是不同的(即對例如,不同的瀏覽器)

如何找出一個幀速率特殊案例?

謝謝

+0

*「回調的數目通常爲每秒60次,但一般會匹配在大多數Web瀏覽器按照W3C推薦的顯示器刷新率。」 *,它通常是相當不錯的準確,但如果你真的想知道幀率只需幾秒鐘計算每秒回調數並獲得平均值,那麼對於大多數情況來說應該足夠準確。 – adeneo

+0

你已經在你的'rAF()'回調函數中傳遞了一個高精度參數,只需將它保存在回調函數的範圍之外,並檢查上次在下一次迭代時保存的差異。 – Kaiido

回答

2

這裏是一個功能查找依賴requestAnimationFrame()爲支持它的所有設備的幀速率。唯一的缺點是精度不是即時的。您可以很容易地將四捨五入到最接近的標準幀速率,並以這種方式獲得非常快速的返回值,但此代碼計算平均超過60幀以獲得requestAnimationFrame()的更準確讀數。

function RAF_tester() { 
    var i = 1; 
    var prevT; 
    requestAnimationFrame(function(startT) { 
     requestAnimationFrame(function RAF_loop(currentT) { 
      var elapsedT = currentT - startT; 
      var RAF_interval = currentT - prevT; 
      var RAF_average = 1000/(elapsedT/i); 
      console.log(RAF_interval); 
      diagnostic.innerHTML = 'Average FPS: '+RAF_average; 
      prevT = currentT; 
      i += 1; if (i<61) { requestAnimationFrame(RAF_loop); } 
     }); 
    }); 
} 

希望它適合你!

嘗試在codepen:http://codepen.io/kandleflame/pen/QEgQoE

+0

...創建一個新的'Date'對象,並在他的不準確的now()方法中生效,同時在rAF的回調中傳遞一個高精度的時間參數...奇怪... – Kaiido

+0

更改爲'performance .now()'爲更高的精度。 –

+1

你甚至不需要調用'performance.now()',它已經在你的回調中作爲參數傳遞了:'requestAnimationFrame(function(time){})''time'將是一個[DOMHighResTimeStamp](https ://developer.mozilla.org/en-US/docs/Web/API/DOMHighResTimeStamp)就像'performance.now()'返回的那個一樣。不需要調用任何東西,它將表示調用完整堆所請求的函數的時間,同時自己調用它只會返回當您調用它時的時間。其他函數在堆疊之前會有所不同,也僅僅是因爲通話需要一些時間 – Kaiido