requestAnimationFrame,计算时间间隔
时间: 2024-11-08 21:10:55 浏览: 45
`requestAnimationFrame`(RAF)是浏览器提供的一个API,用于在下一次浏览器重绘之前安排回调函数执行。它的核心作用是优化动画性能,确保动画帧率接近用户设备的最大刷新率(通常是60fps)。当你使用`requestAnimationFrame`,浏览器会帮你在最合适的时机执行回调,这样可以避免不必要的计算,节省CPU资源。
当你在一个`requestAnimationFrame`回调中执行`Date.now()`或者`performance.now()`,你会发现返回的时间戳并不是两个连续帧之间的真实时间间隔,因为浏览器可能会调整这一时间间隔以保持稳定的帧率。真实的间隔可能会大于或小于预期的16毫秒(对于60fps)。
例如,当设备处于低负载时,浏览器可能会跳过一些帧,让每个帧间隔更长;而当设备负载增加时,为了保证流畅度,可能会将一些帧合并,使得相邻帧之间的间隔变得更短。所以,`requestAnimationFrame`提供的时间差并不直接等于物理时间,而是优化过的帧间间隔。
想要获取更准确的帧速率相关的延迟,你可以采用`performance.now()`而不是`Date.now()`,因为它考虑到浏览器的内部调整:
```javascript
let lastTime = performance.now();
function animate() {
const currentTime = performance.now();
const delta = currentTime - lastTime;
// ... 执行你的动画代码
lastTime = currentTime;
requestAnimationFrame(animate);
}
```
然后你可以通过计算`delta`值来得到近似的帧率,但注意这仍然不是精确到每一帧的物理时间。
阅读全文