我一直在试验Greensock's TweenMax JS和Three.js。由于两个库都使用requestAnimationFrame(rAF),我需要决定哪个库应该处理它。
如果我使用内置于Three.js
的rAF,它运行大约30fps并且相当平滑。
如果我使用TweenMax
例如:TweenMax.ticker.addEventListener('tick', animate);
它的运行速度约为55-60fps,但有点不稳定。
我可以使用TweenMax
更改TweenMax.ticker.fps(30);
中的fps,其中预期的运行类似于Three.js rAF版本。
我的问题是哪种方法更受欢迎,哪种方法被认为是最佳方法?另外,如果我选择Three.js,我可以在其rAF实现中更改fps吗?
最后,您如何决定fps以适应更广泛的受众?限制为30fps似乎没问题,但有点武断,一些用户可能比我允许的速率更高。
更新:
根据mrdoob和jack的反馈,我使用TweenMax在three.js和rAF中尝试了rAF,并且打开和关闭了antialias。
antialias on:
Three.js rAF (default) - 30fps smooth.
TweenMax rAF (default) - 55-60fps slightly choppy.
TweenMax rAF (fps(30)) - 30fps smooth.
antialias off:
Three.js rAF (default) - 30 - 60fps slightly choppy.
TweenMax rAF (default) - 92-120fps slightly choppy.
TweenMax rAF (fps(30)) - 30fps smooth.
可以与知道requestAnimationFrame如何工作以帮助解释差异的人一起做,现在我将使用TweenMax 30fps或Three.js同时使用antialias。
答案 0 :(得分:3)
只是为了澄清一下,默认的TweenMax RAF行为不会对fps设置上限,因为......好吧......首先是requestAnimationFrame的意思 - 它的目的是浏览器指示(通常约为60fps)。使用 TweenMax.ticker.fps()设置特定的fps只会给它设置一个上限(除非你设置 TweenMax.ticker.useRAF(false),在这种情况下它将使用 setTimout()以尽可能接近您设置的fps。
我注意到有人说你必须在TweenMax中设置一个fps以使其顺利进行,我只想澄清它不是真的 - 如果/当它们发生得太快时这样做只是跳过RAF更新 - 我可以不要想象这会让事情变得更顺畅。它可能会做相反的事情。
如果您希望 LOWER 低于正常的浏览器刷新率(通常大约为60fps),请使用 TweenMax.ticker.fps()。如果您正在寻找最平滑的结果,我可能会坚持使用TweenMax的默认配置。您可以尝试关闭requestAnimationFrame并使用非常高的fps( TweenMax.ticker.useRAF(false); TweenMax.ticker.fps(100)),但不好的一面是你失去了所有的RAF的好处,例如当选项卡处于非活动状态时,移动设备上的电池寿命得到改善,本机浏览器的同步更新会刷新等等。
生涩行为的最大原因是浏览器中的图形渲染与JavaScript动画引擎无关。
我不熟悉Three.js,所以我不能说它的功能,或者哪个选项更适合用来驱动你的其他东西(抱歉)。我只能说我是GreenSock的忠实粉丝(哈哈)
答案 1 :(得分:0)
当我检查两个实现时实际上它们实际上非常相似。它们都使用this实现,但差别很小。
Three.js实现计算你的最后一次调用并延迟下一次调用(16 ms - lastCall)以修复你的fps 60.如果它不能在16 ms内完成,它将自然等待它所需的时间。
TweenMax实现不会初始修复您的fps。相反,你必须手动调用fps。这让局面波涛汹涌。因为你必须给出总是正确的fps值(不多 - 不要少)来调整延迟时间。
编辑:
我必须编辑TweenMax行为,因为我错过了构造函数在ticker类末尾调用this.fps(fps),当fps未定义时,将默认fps设置为60。