为什么要把requestAnimationFrame放在函数体前面?

6
我一直在画布上写作,做法始终如一:
function animate() {
  //do stuff in the animation

  requestAnimationFrame(animate);
}

最近,我经常看到这样的做法:
function animate() {
  requestAnimationFrame();

  //do stuff in the animation
}

虽然我当然能看到按照“我的方式”做会有好处(主要是如果有bug,它不会继续调用更多的帧),但我无法找到先调用下一帧的任何好处。

有人能解释一下这样做的可能好处吗?或者你能证明不应该这样做吗?一定需要一个来源,因为我在网上看到过这种做法,但没有人能真正给出一个具体的原因。


w3c的示例将其称为after。http://www.w3.org/TR/animation-timing/ - Loktar
1个回答

4
如果你明白了requestAnimationFrame只是请求下一个动画处理周期,而不是实际触发动画处理周期,那么就可以更清晰地放置rAF调用的位置。
立即调用下一个rAF帧会使你最有可能在下一个rAF周期执行时捕捉到它。例如,如果你的“东西”需要大约3ms来执行,并且下一个rAF周期将在4ms后开始,则你可能会在4ms内捕捉到下一个周期,而不是在4+16ms内捕捉到后续周期。虽然你有1ms的余地(对于cpu来说几乎是永恒的),但系统可能会安排其他东西占用你的1ms余量(比如垃圾回收),因此错过下一个rAF周期似乎是不可能的。
另一方面,如果你的“东西”平均需要15ms才能完成,则把rAF调用放在最后。虽然放在最后偶尔会错过一次执行,但这比冒着多个“东西”堆积的风险要好得多。
总的来说,考虑到这些因素,把rAF调用放在末尾会更安全,偶尔会错过一次rAF周期。

2
下一帧不管是在函数的开头还是结尾,都需要在堆栈清除后才能发生,这不会影响结果。 - Jeremy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接