Three.js requestAnimationFrame或TweenMax tick处理程序

时间:2012-08-22 13:36:47

标签: three.js tweenmax

我一直在试验Greensock's TweenMax JSThree.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. 

http://jsfiddle.net/cR7Lx/21/

TweenMax rAF (default) - 55-60fps slightly choppy. 

http://jsfiddle.net/cR7Lx/23/

TweenMax rAF (fps(30)) - 30fps smooth. 

http://jsfiddle.net/cR7Lx/24/

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。

2 个答案:

答案 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。