Requestanimationframe polyfill参数

时间:2015-08-21 07:33:53

标签: javascript function polyfills

我有2个关于requestanimationframe polyfill函数的问题:

1)为什么element中包含window.requestAnimationFrame=function(callback, element)作为参数?

2)为什么16在这里使用:var timeToCall =Math.max(0, 16 - (currTime - lastTime));?这取决于程序员的判断,不是太大也不是太低,因为我们从中减去了currTime-lastTime?

(function() {
    var lastTime =0;
    var vendors=['ms', 'moz', 'webkit', 'o'];
    for(var x=0; x<vendors.length && !window.requestAnimationFrame; ++x) {
        window.requestAnimationFrame=window[vendors[x]+'RequestAnimationFrame'];
        window.cancelAnimationFrame =
        window[vendors[x]+ 'CancelAnimationFrame'] ||
        window[vendors[x] +'CancelRequestAnimationFrame'];
    }
    if (!window.requestAnimationFrame)
    window.requestAnimationFrame=function(callback, element) {
        var currTime =new Date().getTime();
        var timeToCall =Math.max(0, 16 - (currTime - lastTime));
        var id =window.setTimeout(function() { callback(currTime+timeToCall); },
        timeToCall);
        lastTime =currTime + timeToCall;
        return id;
    };
    if (!window.cancelAnimationFrame)
    window.cancelAnimationFrame=function(id) {
        clearTimeout(id);
    };
}());

1 个答案:

答案 0 :(得分:1)

正如Hacketo所说,元素确实不是window.requestAnimationFrame的参数,它只需要回调函数。

其次,16用于确定最大FPS。 setTimeout函数的触发速度不会超过每秒60次。然而,这是游戏同步的脆弱方法。 This article描述了一种很好的方法。