对于debounce/throttle使用requestAnimationFrame而不是setTimeout有什么好处
Is there any advantage to using requestAnimationFrame instead of setTimeout for debounce/throttle
我在MDN上遇到过这个使用requestAnimationFrame
而不是setTimeout
的例子:
// Reference: http://www.html5rocks.com/en/tutorials/speed/animations/
var last_known_scroll_position = 0;
var ticking = false;
function doSomething(scroll_pos) {
// do something with the scroll position
}
window.addEventListener('scroll', function(e) {
last_known_scroll_position = window.scrollY;
if (!ticking) {
window.requestAnimationFrame(function() {
doSomething(last_known_scroll_position);
ticking = false;
});
}
ticking = true;
});
这让我思考我们是否可以用requestAnimationFrame
代替setTimeout(fn, 0)
,如果有什么好处?我在谷歌上搜索过,似乎所有的比较都是在动画的背景下完成的,但是不相关的功能呢?比如debounce/throttle或者只是如果你需要在重绘后运行代码?
RequestAnimationFrame是很好的,如果你想确保你没有做不必要的工作,因为你改变了一些东西在两个帧更新之间两次。
就其本身而言,requestAnimationFrame对动画之外的任何东西都没有用处,因为它只能等待16.666毫秒(如果没有延迟),因此您需要将多个链接在一起。但是如果你将它与setTimeout配对,那么你将能够等待特定的毫秒数,并确保你在正确的时间内绘制所有内容。
requestAnimationFrame
在浏览器处于重新绘制步骤时调用。所以从理论上讲,如果你试图同步元素的属性(比如位置)和滚动位置,它应该可以避免闪烁/抖动。
setTimeout
将在至少n
毫秒之后被调用,所以你的回调可能会在下一次重画之前被调用多次,你会浪费CPU的使用,或者多次连续的重画发生而没有调用回调,这将导致闪烁/抖动,如果你试图同步元素的属性与滚动位置。
除了以上答案,
当使用requestAnimationFrame时,你的动画只会在选项卡(或窗口)对用户可见时运行。这意味着更少的CPU, GPU和内存的使用,因此电池友好。这对于通常电池寿命相对较短的移动设备尤其重要。
但是对于流畅的动画,我们必须注意我们的帧渲染发生在少于16ms,所以回调应该尽可能小的60 fps动画
- 这是什么 ==- javascript 运算符
- 我的单元测试选项是什么
- window.setTimeout()和setTimeout()有什么区别
- 当窗口失焦时,setTimeout会发生什么
- 这个奇怪的setTimeout语法是什么
- setTimeout vs. 事件绑定/取消绑定;什么更有效
- 什么时候适合使用 setTimeout 与 Cron
- “setTimeout”将“this”绑定到什么
- 什么是错误的java脚本settimeout
- setTimeout(fn, 0)和setTimeout(fn, 1)的区别是什么?
- 对于debounce/throttle使用requestAnimationFrame而不是setTimeout有什么好处
- setTimeout延迟不起作用-我做错了什么
- setTimeout函数发生了什么
- setTimeout执行的函数是什么?
- setTimeout(fn(), t)和setTimeout("fn()", t)有什么区别?
- Javascript setTimeout不工作,我做错了什么
- 当计算机进入睡眠状态时,setTimeout会发生什么
- 延迟1调用setTimeout的目的是什么
- 在Javascript中,setTimeout中使用的变量的作用域是什么?
- 有什么好的理由使用窗口吗?setTimeout而不是setTimeout