我有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);
};
}());
答案 0 :(得分:1)
正如Hacketo所说,元素确实不是window.requestAnimationFrame的参数,它只需要回调函数。
其次,16用于确定最大FPS。 setTimeout函数的触发速度不会超过每秒60次。然而,这是游戏同步的脆弱方法。 This article描述了一种很好的方法。