0

0

HTML如何计算页面FPS_性能监测实现方法【技巧】

看不見的法師

看不見的法師

发布时间:2025-12-17 11:55:02

|

472人浏览过

|

来源于php中文网

原创

可通过五种方法实时监测网页FPS:一、requestAnimationFrame计算帧间隔;二、PerformanceObserver监听paint事件;三、chrome://tracing离线分析;四、performance.getEntriesByType('frame')获取帧信息;五、Canvas合成帧检测。

html如何计算页面fps_性能监测实现方法【技巧】

如果您需要实时监测网页在浏览器中的渲染帧率,以评估动画流畅度或识别性能瓶颈,则可以通过JavaScript结合浏览器提供的API来获取当前页面的FPS值。以下是实现此功能的多种方法:

一、使用requestAnimationFrame计算帧间隔

该方法基于requestAnimationFrame的回调机制,通过记录连续两帧之间的时间差,反向推算出每秒渲染帧数。其原理是requestAnimationFrame会在浏览器下一次重绘前执行回调,时间精度高且与刷新率同步。

1、定义一个全局变量lastTime用于存储上一帧的时间戳,初始值设为0。

2、定义一个frameCount变量用于累计当前秒内触发的帧数,初始值设为0。

立即学习前端免费学习笔记(深入)”;

3、定义一个startTime变量记录当前计时周期起始时间,初始值为performance.now()。

4、编写一个循环函数,在其中调用requestAnimationFrame,并在回调中获取当前时间戳now。

5、计算当前帧与上一帧的时间差interval = now - lastTime,若interval大于0则累加frameCount。

6、当now - startTime >= 1000时,将frameCount作为当前FPS值输出,并重置frameCount为0、startTime为now。

7、更新lastTime = now,然后再次调用该循环函数。

二、利用PerformanceObserver监听paint事件

该方法依赖PerformanceObserver API监听paint条目,从中提取FP(First Paint)和FCP(First Contentful Paint)等指标,并通过统计单位时间内paint事件数量估算FPS。适用于关注页面首次渲染质量的场景。

1、创建一个新的PerformanceObserver实例,传入回调函数,观察类型设置为'paint'。

2、在回调函数中,遍历entries参数获取所有paint性能条目。

3、筛选出entryType为'paint'且name为'first-paint'或'first-contentful-paint'的条目。

4、维护一个时间窗口数组,仅保留过去1秒内发生的paint事件时间戳。

5、每次新增paint时间戳后,移除早于当前时间减1000毫秒的所有旧时间戳。

6、数组长度即为近1秒内的paint事件数,可作为粗略FPS参考值。

三、读取chrome://tracing导出的trace数据进行离线分析

该方法不适用于运行时监测,但可用于深度性能诊断。通过手动录制页面交互过程的trace文件,解析其中Category为"rendering"的FrameStart和FrameEnd事件,精确统计每秒完成的完整帧数。

1、在Chrome地址栏输入chrome://tracing,点击“Record”按钮。

2、勾选“Rendering”、“Layout”、“Paint”、“Composite”等与渲染相关选项。

Sora
Sora

Sora是OpenAI发布的一种文生视频AI大模型,可以根据文本指令创建现实和富有想象力的场景。

下载

3、开始录制后执行目标操作,完成后点击“Stop”并保存trace.json文件。

4、使用脚本读取trace.json,过滤出ph字段为"B"且cat包含"rendering"且name为"FrameStart"的事件。

5、匹配对应ph为"E"且name为"FrameEnd"的事件,确保ts与dur字段构成完整帧周期。

6、按时间戳分组,统计每1000ms区间内有效帧的数量,得出各时段FPS分布。

四、使用window.performance.getEntriesByType获取帧信息

部分新版Chrome支持通过performance.getEntriesByType('frame')获取帧性能条目,每个条目包含duration字段,表示该帧持续时间,据此可计算瞬时FPS。

1、检查浏览器是否支持frame类型的performance entry:if ('getEntriesByType' in performance && performance.getEntriesByType('frame').length > 0)

2、调用performance.getEntriesByType('frame')获取最近若干帧数据。

3、取数组末尾至少两个条目,确保它们具有连续的frame ID。

4、计算duration平均值avgDuration = (entry1.duration + entry2.duration) / 2。

5、瞬时FPS = Math.round(1000 / avgDuration)。

6、注意该API返回条目数量有限,需定期清理并重新采集。

五、注入自定义Canvas合成帧检测逻辑

该方法适用于WebGL或复杂Canvas动画场景,通过在每一帧绘制结束时插入标记时间点,再结合定时器采样,实现对实际合成帧率的观测。

1、在Canvas渲染主循环末尾添加performance.now()打点,并存入一个固定长度为60的数组。

2、启动一个setInterval,间隔1000ms执行一次FPS计算逻辑。

3、从数组中取出最近一次写入位置向前推60个元素(若存在),计算首尾时间差。

4、若时间差大于0,则FPS = Math.round(60000 / 时间差)。

5、将结果写入页面浮动面板或console输出,确保该面板不参与Canvas重绘以免干扰测量

6、每次采样后清空数组或滚动覆盖旧值,保持内存占用稳定。

相关专题

更多
js获取数组长度的方法
js获取数组长度的方法

在js中,可以利用array对象的length属性来获取数组长度,该属性可设置或返回数组中元素的数目,只需要使用“array.length”语句即可返回表示数组对象的元素个数的数值,也就是长度值。php中文网还提供JavaScript数组的相关下载、相关课程等内容,供大家免费下载使用。

557

2023.06.20

js刷新当前页面
js刷新当前页面

js刷新当前页面的方法:1、reload方法,该方法强迫浏览器刷新当前页面,语法为“location.reload([bForceGet]) ”;2、replace方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,不能通过“前进”和“后退”来访问已经被替换的URL,语法为“location.replace(URL) ”。php中文网为大家带来了js刷新当前页面的相关知识、以及相关文章等内容

395

2023.07.04

js四舍五入
js四舍五入

js四舍五入的方法:1、tofixed方法,可把 Number 四舍五入为指定小数位数的数字;2、round() 方法,可把一个数字舍入为最接近的整数。php中文网为大家带来了js四舍五入的相关知识、以及相关文章等内容

756

2023.07.04

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

478

2023.09.01

JavaScript转义字符
JavaScript转义字符

JavaScript中的转义字符是反斜杠和引号,可以在字符串中表示特殊字符或改变字符的含义。本专题为大家提供转义字符相关的文章、下载、课程内容,供大家免费下载体验。

494

2023.09.04

js生成随机数的方法
js生成随机数的方法

js生成随机数的方法有:1、使用random函数生成0-1之间的随机数;2、使用random函数和特定范围来生成随机整数;3、使用random函数和round函数生成0-99之间的随机整数;4、使用random函数和其他函数生成更复杂的随机数;5、使用random函数和其他函数生成范围内的随机小数;6、使用random函数和其他函数生成范围内的随机整数或小数。

1071

2023.09.04

如何启用JavaScript
如何启用JavaScript

JavaScript启用方法有内联脚本、内部脚本、外部脚本和异步加载。详细介绍:1、内联脚本是将JavaScript代码直接嵌入到HTML标签中;2、内部脚本是将JavaScript代码放置在HTML文件的`<script>`标签中;3、外部脚本是将JavaScript代码放置在一个独立的文件;4、外部脚本是将JavaScript代码放置在一个独立的文件。

659

2023.09.12

Js中Symbol类详解
Js中Symbol类详解

javascript中的Symbol数据类型是一种基本数据类型,用于表示独一无二的值。Symbol的特点:1、独一无二,每个Symbol值都是唯一的,不会与其他任何值相等;2、不可变性,Symbol值一旦创建,就不能修改或者重新赋值;3、隐藏性,Symbol值不会被隐式转换为其他类型;4、无法枚举,Symbol值作为对象的属性名时,默认是不可枚举的。

554

2023.09.20

C++ 高级模板编程与元编程
C++ 高级模板编程与元编程

本专题深入讲解 C++ 中的高级模板编程与元编程技术,涵盖模板特化、SFINAE、模板递归、类型萃取、编译时常量与计算、C++17 的折叠表达式与变长模板参数等。通过多个实际示例,帮助开发者掌握 如何利用 C++ 模板机制编写高效、可扩展的通用代码,并提升代码的灵活性与性能。

9

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 4万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 2.4万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号