Skip to content

如何计算浏览器的帧率(FPS)

导读

FPS 是每秒传输帧数(Frames Per Second) requestAnimationFrame 的函数

  • 传入的回调函数会在浏览器下一次重绘之前执行
  • 回调函数执行次数通常是每秒 60 次

方式 1

定义一个固定的帧数,帧数 除以 达到这个帧数所需要的时间, 就是帧率:

js
const getFPS = (callback) => {
  const fpsInterval = 30
  let fpsCount = 0
  let lastTime
  const requestAni = () => {
    if (!lastTime) {
      lastTime = performance.now()
    } else {
      fpsCount++
      if (fpsCount >= fpsInterval) {
        const nowTime = performance.now()
        // 由于performance.now 返回的是 毫秒, 除以 1000, 返回 秒
        const time = (nowTime - lastTime) / 1000
        const fps = Math.round(fpsCount / time)
        lastTime = nowTime
        fpsCount = 0
        callback(fps)
      }
    }
    window.requestAnimationFrame(requestAni)
  }
  window.requestAnimationFrame(requestAni)
}

getFPS((fps) => {
  console.log(fps)
})

方式 2

使用 requestAnimationFrame 的参数自带的时间戳。

js
const getFPS = (callback) => {
  let start
  const requestAni = (timestamp) => {
    if (start === undefined) {
      start = timestamp
    } else {
      const elapsed = (timestamp - start) / 1000
      const fps = Math.round(1 / elapsed)
      start = timestamp
      callback(fps)
    }
    window.requestAnimationFrame(requestAni)
  }
  window.requestAnimationFrame(requestAni)
}

getFPS((fps) => {
  console.log(fps)
})