js加密之requestAnimationFrame的调用频率探讨

requestAnimationFrame 的执行频率是由 浏览器的刷新率 决定的。通常情况下,浏览器的刷新率是 60Hz,也就是每秒刷新 60 次,因此 requestAnimationFrame 的回调函数大约每 16.67 毫秒(1 秒 / 60 次) 执行一次。


关键点

  1. 刷新率(Frame Rate)
    • 大多数现代显示器的刷新率是 60Hz,即每秒刷新 60 次。
    • 一些高端显示器的刷新率可能更高,例如 120Hz 或 144Hz,此时 requestAnimationFrame 的执行频率也会相应提高。
  2. 执行时机
    • requestAnimationFrame 的回调函数会在浏览器下一次重绘之前执行。
    • 它会自动与浏览器的刷新周期同步,确保动画的流畅性。
  3. 节能机制
    • 如果页面处于不可见状态(例如用户切换到了其他标签页),requestAnimationFrame 会自动暂停执行,以减少 CPU 和 GPU 的消耗。

执行频率示例

  • 60Hz 显示器
    • 每 16.67 毫秒执行一次。
    • 1 秒内执行 60 次。
  • 120Hz 显示器
    • 每 8.33 毫秒执行一次。
    • 1 秒内执行 120 次。

如何验证执行频率?

可以通过以下代码测量 requestAnimationFrame 的实际执行间隔:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>requestAnimationFrame Timing</title>
</head>
<body>
    <script>
        let previousTime = performance.now();
        let frameCount = 0;

        function logFrameTime(currentTime) {
            frameCount++;
            const delta = currentTime - previousTime;
            console.log(`Frame ${frameCount}: ${delta.toFixed(2)} ms`);

            previousTime = currentTime;
            requestAnimationFrame(logFrameTime);
        }

        requestAnimationFrame(logFrameTime);
    </script>
</body>
</html>

运行 HTML

输出示例(60Hz 显示器):
Frame 1: 16.67 ms
Frame 2: 16.67 ms
Frame 3: 16.67 ms
...
输出示例(120Hz 显示器):
Frame 1: 8.33 ms
Frame 2: 8.33 ms
Frame 3: 8.33 ms
...

setTimeoutsetInterval 的区别

特性requestAnimationFramesetTimeout / setInterval
执行频率与浏览器刷新率同步(通常 60Hz)手动设置时间间隔(可能不精确)
节能机制页面不可见时自动暂停不会自动暂停
动画流畅性更流畅,避免掉帧可能出现卡顿或掉帧
适用场景动画、游戏等高性能需求简单的定时任务

总结

  • requestAnimationFrame 的执行频率通常为 每秒 60 次(每 16.67 毫秒一次),具体取决于显示器的刷新率。
  • 它会自动与浏览器的刷新周期同步,确保动画的流畅性。
  • 在页面不可见时,requestAnimationFrame 会自动暂停,节省资源。
  • 如果需要更精确的控制,可以通过 performance.now() 测量实际执行时间。
  • 关于和其他两定时器的优缺点,可能还得起一个文章来说明测试了。
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值