想要控制我的动画的FPS是继续使用setTimeout而不是requestAnimationFrame的一个很好的理由吗?

时间:2011-11-19 16:50:34

标签: javascript html5 settimeout requestanimationframe

我想知道我是否应该将游戏切换到requestAnimationFrame。如果还有理由再这样做了,正如我读到的那样,当你在主流浏览器中切换标签时,setTimeout()现在也会暂停。

无论如何,说我想控制动画的FPS。

目前我可以这样做:

k.state.loopinterval = 
window.setInterval(renderLoop(), 1000 / k.settings.engine.fps );

k.settings.engine.fps是所需的fps。

如果我以requestAnimationFrame的方式做到这一点,我就失去了这种可能性,它只会给我任何可以给予的东西:

window.requestAnimFrame(k.operations.startLoop);
renderLoop();

我看到有人建议将requestAnimFrame放在另一个循环中:

setInterval( function () {
    requestAnimationFrame( draw );
}, 1000 / 60 );

那么......我该怎么办?保持原样?

requestAnimationFrame的确切好处是什么,现在切换标签时setTimeout也暂停了?

1 个答案:

答案 0 :(得分:5)

requestAnimationFrame是制作动画的正确方法。

<强>为什么吗

因为浏览器可以优化渲染以使动画更加流畅。回答这个问题,另一种方式是:

window.requestAnimFrame = (function(){
    return  window.requestAnimationFrame       || 
          window.webkitRequestAnimationFrame || 
          window.mozRequestAnimationFrame    || 
          window.oRequestAnimationFrame      || 
          window.msRequestAnimationFrame     || 
          function(callback, element){
            window.setTimeout(callback, 1000 / 60);
          };
})();

下面的链接中有另一种方式。

当您调用requestAnimation时,您可以让浏览器了解何时重绘html。如果您在CSS中进行动画/过渡并移动内容或更改背景(作为精灵),则使用requestAnimation将使调用requestAnimation时渲染工作正常。没有它,浏览器将呈现任何时间的任何内容,然后可以进行更多重绘。

即便如此,浏览器的运行方式也会比我们还不知道的更多优化。让浏览器了解我们正在做什么,然后他们帮助我们。

我找到this link,可以添加更多想法