我一直在尝试Greensock 的 TweenMax JS和Three.js。由于两个库都使用 requestAnimationFrame (rAF),我需要决定哪个库应该处理这个问题。
如果我使用内置的 rAF Three.js,它的运行速度约为 30fps,并且非常流畅。
如果我使用TweenMaxeg:TweenMax.ticker.addEventListener('tick', animate);它的运行速度约为 55-60fps,但有点不稳定。
我可以更改 fps TweenMax,TweenMax.ticker.fps(30);其运行方式与 Three.js rAF 版本类似。
我的问题是哪种方法是首选,并且其中一种方法是否被视为最佳实践?另外,如果我选择 Three.js,我是否可以更改其 rAF 实现中的 fps?
最后,您将如何决定 fps 以适应更广泛的受众?限制为 30fps 似乎没问题,但有点武断,有些用户可能能够达到比我允许的更高的速率。
更新 :
根据 mrdoob 和 jack 的反馈,我尝试了 Three.js 中的 rAF 和使用 TweenMax 的 rAF,并打开和关闭抗锯齿功能。
抗锯齿:
Three.js rAF (default) - 30fps smooth.
Run Code Online (Sandbox Code Playgroud)
TweenMax rAF (default) - 55-60fps slightly choppy.
Run Code Online (Sandbox Code Playgroud)
TweenMax rAF (fps(30)) - 30fps smooth.
Run Code Online (Sandbox Code Playgroud)
抗锯齿关闭:
Three.js rAF (default) - 30 - 60fps slightly choppy.
TweenMax rAF (default) - 92-120fps slightly choppy.
TweenMax rAF (fps(30)) - 30fps smooth.
Run Code Online (Sandbox Code Playgroud)
可以找一个知道 requestAnimationFrame 在底层如何工作的人来帮助解释这些差异,现在我将使用 TweenMax 30fps 或 Three.js,两者都启用抗锯齿功能。
只是为了澄清一下,默认的 TweenMax RAF 行为不会对 fps 施加上限,因为……好吧……这首先是 requestAnimationFrame 的要点 - 它旨在成为浏览器指定的内容(并且通常是约 60 fps)。使用TweenMax.ticker.fps()设置特定的 fps只会对其设置上限(除非您设置TweenMax.ticker.useRAF(false)在这种情况下,它将使用 setTimout ()来尽可能接近您的 fps放)。
我注意到有人说你必须在 TweenMax 中设置 fps 才能使其流畅,我只是想澄清这不是真的 - 这样做只会跳过 RAF 更新(如果/当它们发生得太快时) - 我无法想象这会让事情变得更顺利。它可能会起到相反的作用。
仅当您希望将帧速率降低到低于正常浏览器刷新率(通常为 60fps 左右)时,才使用TweenMax.ticker.fps() 。如果您正在寻找最平滑的结果,我可能会坚持使用 TweenMax 的默认配置。您可以尝试关闭 requestAnimationFrame 并使用非常高的 fps (TweenMax.ticker.useRAF(false); TweenMax.ticker.fps(100)),但缺点是您失去了 RAF 的所有好处,例如改进的电池当选项卡处于非活动状态时,移动设备上的生活、与本机浏览器刷新同步更新等。
造成抖动行为的最大原因是浏览器中的图形渲染,这与 JavaScript 动画引擎无关。
我不熟悉 Three.js,所以我无法谈论它的功能或哪个选项更适合用来驱动你的其他东西(抱歉)。我只能说我是 GreenSock 的忠实粉丝(哈哈)