Javascript 每次重画调用一个requestAnimationFrame还是多次调用?
当存在多个与屏幕重画相关的requestAnimationFrame回调时会发生什么 使用两个requestAnimationFrame块,即Javascript 每次重画调用一个requestAnimationFrame还是多次调用?,javascript,html,Javascript,Html,当存在多个与屏幕重画相关的requestAnimationFrame回调时会发生什么 使用两个requestAnimationFrame块,即 (function a() { requestAnimationFrame(a); }()) (function b() { requestAnimationFrame(b); }()) 执行的顺序是: 1: -> a -> b -> screen redrawn -> a ->
(function a() {
requestAnimationFrame(a);
}())
(function b() {
requestAnimationFrame(b);
}())
执行的顺序是:
1:
-> a
-> b
-> screen redrawn
-> a
-> b
-> screen redrawn
...
-> a
-> screen redrawn
-> b
-> screen redrawn
-> a
-> screen redrawn
...
2:
-> a
-> b
-> screen redrawn
-> a
-> b
-> screen redrawn
...
-> a
-> screen redrawn
-> b
-> screen redrawn
-> a
-> screen redrawn
...
这是一个有趣的问题。根据我的阅读,在进入下一帧之前,应该为每个注册的回调触发一个
MozBeforePaint
事件。为了测试,我稍微修改了您的代码():
HTML
<button id="start">Start</button>
<button id="stop">Stop</button>
单击start
后的输出似乎确认了该期望。第一次调用a()
和b()
记录未定义的时间戳,因为它们直接启动动画,而不是响应回调。随后每次调用a()
都会记录一个与调用b()
记录的事件相匹配的DOMHighResTimeStamp
,这强烈表明触发两个回调的是同一事件
输出
a undefined
b undefined
a 123182.04999999944
b 123182.04999999944
a 123198.73199999893
b 123198.73199999893
a 123215.22000000004
b 123215.22000000004
a 123231.9179999995
b 123231.9179999995
a 123248.59099999958
b 123248.59099999958
a 123265.21899999898
b 123265.21899999898
注意事项:
- 我对实现没有具体的第一手知识;只是我对文档和测试的解释
- 该测试在MacOSXChrome35中执行;其他浏览器可能会产生不同的结果