前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何计算浏览器页面的帧数 FPS?

如何计算浏览器页面的帧数 FPS?

作者头像
前端西瓜哥
发布2022-12-21 20:17:11
1.1K0
发布2022-12-21 20:17:11
举报
文章被收录于专栏:前端西瓜哥的前端文章

大家好,我是前端西瓜哥。今天说说如何计算浏览器页面的帧数。

我们需要用到 requestAnimationFrame 方法。

requestAnimationFrame

requestAnimationFrame 方法接受一个回调函数,并会在 浏览器下一次重渲染前调用 这个回调函数。

此外,我们通常 raf 来代表冗长的 requestAnimationFrame。

代码语言:javascript
复制
const id = window.requestAnimationFrame((timestamp) => {
  // ...
})

回调函数会拿到一个高精度的时间点,称为 DOMHighResTimeStamp,表示执行回调函数的时刻。单位是 ms,有小数位,精度较高。Performance.now() 的返回值也是 DOMHighResTimeStamp。

需要注意的是这个时间点并不是当前时间的时间戳,而是从应用启动后进过的时间。

另外,可以通过 cancelAnimationFrame 方法取消,需要提供 raf 返回的 id:

代码语言:javascript
复制
cancelAnimationFrame(id);

实时显示 FPS

FPS,是 frames per second 的缩写,也就是一秒渲染了多少帧的画面。对于浏览器来说,通常 fps 为 60。

代码语言:javascript
复制
FPS = 一秒的帧数 / 1s

配合 raf 会在每次重绘前执行,我们可以计算在 1 秒内,统计调用 raf 的次数 count。当时间间隔超过 1 秒后,就读取这个 count,然后重置 count 和间隔开始时间。

实现如下:

代码语言:javascript
复制
let count = 0;
let prevTimestamp;

function showFPS(fps) {
  // 这里设置如何将 fps 数值输出
  // 比如你可以将其更新到某个 DOM 元素上
  console.log(fps);
}

function loop(timestamp) {
  if (prevTimestamp) {
    count++;
    // 间隔超过 1s,将之前计算的 count 输出
    if (timestamp - prevTimestamp >= 1000) {
      showFPS(count);
      prevTimestamp = timestamp;
      count = 0;
    }
  } else {
    prevTimestamp = timestamp;
  }
  window.requestAnimationFrame(loop);
}

window.requestAnimationFrame(loop);

理论上,我们还可以直接用 1 / timestamp * 1000 得到几毫秒内的 FPS。

但没有太大意义,因为过于微观,可能突然在某个瞬间卡顿,但很快又恢复正常,这个微小的变化容易忽略,如果体现在 1 s 中则更容易观测些。且频繁地将 FPS 值打印出来,其本身也会导致性能的下降,不利于观测。

结尾

利用 requestAnimationFrame 会在页面渲染前执行的特性,我们可以去计算页面的 FPS。

我是前端西瓜哥,欢迎关注我,学习更多前端知识。


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-12-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端西瓜哥 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • requestAnimationFrame
  • 实时显示 FPS
  • 结尾
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档