JavaScript有比requestAnimationFrame更好的动画方法吗?

3

处处都有使用requestAnimationFrame的建议。但没有人告诉你,Chrome会根据你的电源计划、打开的标签数和月相来限制到48或30fps,而不以任何方式通知你。它会在不考虑实际工作负载的情况下执行此操作。

对于实际的动画,这是可以接受的,但不太理想。您可以使用经过的时间来生成独立于帧率的新动画帧。

但对于像模拟器这样的东西来说,这是不可接受的。

我正在使用SharedArrayBuffers,因此我的JavaScript已经包含了让您使用一些额外API的恼人标头。是否有任何替代requestAnimationFrame的方法或强制它实际运行至少60Hz的方法?


我从未听说过那种限制,而且我确实深入研究了requestAnimationFrame(为帮助某人撰写学术论文)。你是从哪里听说的?如果没有人告诉你,那就展示一下你的操作,让我们相信它们会被限制。我在代码中看到的唯一限制是针对后台标签页的,否则rAF由监视器的VSync信号控制。我猜你使用的是类似G-Sync的监视器,而且你的监视器实际上是导致帧率下降的原因,而不是浏览器。 - Kaiido
关于“对于像模拟器这样的东西,这是不可接受的。”为什么?rAF应该用于屏幕上发生的事情,那么模拟器在这里有什么特别之处?如果您需要稳定的时钟来控制逻辑,请使用真实的计时器。 - Kaiido
1个回答

2
没有替代方案,因为浏览器的绘制工作会在每次调用requestAnimationFrame回调函数时执行(当您在每个下一次调用时都保持调度时)。因此,如果您以某种方式进行更频繁的迭代,它将无济于事,因为其中一些更改不会显示出来。
如果问题涉及时间,请注意回调函数会附带一个时间戳,这可以帮助您进行现实计算。这并不会改变可变的帧速率,但至少允许您知道经过了多少时间,并基于此进行计算,而不是基于回调被调用的次数。

谢谢留言。我想我的问题太长了,因为我已经说过这就是时间戳的确切作用以及为什么我需要60+fps。那么有什么方法可以处理节流吗? - std''OrgnlDave
如果rAF给你30fps,那么就没有办法获得60fps。但相反是可能的。 - trincot

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