喜歡玩遊戲的都知道FPS,FPS的概念來源就是遊戲和視頻,也就是每秒的幀數。打了幾十年的遊戲深受FPS困擾啊,MMP的一點都不流暢太特麼卡了啊... 回正題,在頁面上,FPS是頁面內容渲染時的幀率,FPS越低頁面也就越卡。做爲3年+的前端開發工做者,今天說說我在工做中是怎麼監控FPS的。前端
chrome
performance
rendering
FPS meter
requestAnimationFrame
chrome
開發者工具-performance
,能夠看到reload button
,click it!
More tools
中的rendering
,勾選上FPS meter
這時候確定會有人疑惑,爲何要去監控?做爲前端開發者,咱們必須重視用戶體驗,平日裏本身玩遊戲也好看視頻也罷還有接觸各類頁面,網絡良好的狀況下''頁面卡"不難受麼?chrome
收!回來看頁面FPS,rendering顯示0-60,即60爲最佳,也就是16.5ms左右渲染一次,那麼咱們就有了以下的思路:瀏覽器
FPS採集方案引用淘寶前端團隊的《無線性能優化:FPS 測試》性能優化
let lastTime = performance.now() let frame = 0 let lastFameTime = performance.now() const loop = time => { let now = performance.now() let fs = (now - lastFameTime) lastFameTime = now let fps = Math.round(1000 / fs) frame++ if (now > 1000 + lastTime) { fps = Math.round(( frame * 1000 ) / ( now - lastTime )) frame = 0 lastTime = now } window.requestAnimationFrame(loop) } 複製代碼
經過 requestAnimationFrame API
來定時執行一些js
代碼,若是瀏覽器卡頓,沒法很好地保證渲染的頻率,1s 中 frame
沒法達到 60
幀,便可間接地反映瀏覽器的渲染幀率。關於 requestAnimationFrame API
的細節,能夠參看 MDN 上的文檔。bash
經過這種方式,結合咱們自定義的卡頓標準(我是按連續3個低於20FPS
),經過如下代碼判斷FPS
數據的卡頓,最終上報統計數據(此處僅提供判斷卡頓代碼)markdown
/** * @function isLowFPS * @param | FPSList 採集的FPS值 * @param | below FPS卡頓的限定值 * @param | number below個數 */ const isLowFPS = (FPSList, below, number) => { let count = 0 for(let i = 0; i < FPSList.length; i++) { if (FPSList[i] < below) { count++ } else { count = 0 } if (count >= number) { return true } } return false } 複製代碼