网站首页 > 技术文章 正文
大家好,我是前端西瓜哥。今天说说如何计算浏览器页面的帧数。
我们需要用到 requestAnimationFrame 方法。
requestAnimationFrame
requestAnimationFrame 方法接受一个回调函数,并会在 浏览器下一次重渲染前调用 这个回调函数。
此外,我们通常 raf 来代表冗长的 requestAnimationFrame。
const id = window.requestAnimationFrame((timestamp) => {
// ...
})
回调函数会拿到一个高精度的时间点,称为 DOMHighResTimeStamp,表示执行回调函数的时刻。单位是 ms,有小数位,精度较高。Performance.now() 的返回值也是 DOMHighResTimeStamp。
需要注意的是这个时间点并不是当前时间的时间戳,而是从应用启动后进过的时间。
另外,可以通过 cancelAnimationFrame 方法取消,需要提供 raf 返回的 id:
cancelAnimationFrame(id);
实时显示 FPS
FPS,是 frames per second 的缩写,也就是一秒渲染了多少帧的画面。对于浏览器来说,通常 fps 为 60。
FPS = 一秒的帧数 / 1s
配合 raf 会在每次重绘前执行,我们可以计算在 1 秒内,统计调用 raf 的次数 count。当时间间隔超过 1 秒后,就读取这个 count,然后重置 count 和间隔开始时间。
实现如下:
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。
我是前端西瓜哥,欢迎关注我,学习更多前端知识。
猜你喜欢
- 2025-10-08 新一代浏览器 Web 引擎 Ladybird 已狂揽 4.4w star!
- 2025-10-08 宇宙厂:为什么浏览器会限制 JavaScript 计时器?
- 2025-10-08 每个前端开发者应该掌握的10个浏览器技巧
- 2025-01-07 浏览器运行 Java 的7种尖端技术!
- 2025-01-07 网页如何唤起应用程序?
- 2025-01-07 Chatty:如何启动 WebGPU 在浏览器运行 LLM ?
- 2025-01-07 前端跨浏览器标签页数据共享解决方案
- 2025-01-07 vue项目如何有效解决的浏览器的缓存问题
- 2025-01-07 你知道HTML、CSS、JS文件在浏览器中是如何转化成页面的吗?
- 2025-01-07 VS Code如何内置Chrome浏览器?超简单
你 发表评论:
欢迎- 最近发表
-
- Three.js vs Unity:工业可视化为何选择Web方案?
- 一款全新Redis UI可视化管理工具,支持WebUI和桌面——P3X Redis UI
- 时间线可视化实战:三款AI工具实测,手把手教你制作人生轨迹图
- 【推荐】一款可视化在线 Web 定时任务管理平台,支持秒级任务设置
- 重磅更新!FastDatasets 推出可视化 Web 界面
- 模具设计之UG钣金实例教程(3)_ug钣金基础教程
- 前端基于 RBAC 模型的权限管理实现
- 别再把JWT存在localStorage里了!2025年前端鉴权新思路
- 模具设计之曲面造型中不圆润的曲面如何处理技巧
- 9个专业级别的CSS技巧区分了解和精通的鸿沟
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (80)
- oracle 工具 (55)
- oracle 内存 (55)
- oracle 导出表 (62)
- oracle约束 (54)
- oracle 中文 (51)
- oracle链接 (54)
- oracle的函数 (58)
- oracle面试 (55)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)