2012-10-30 43 views
4

我注意到,每当我停靠浏览器窗口或切换标签时,requestAnimationFrame停止被调用(我希望发生这种情况)。requestAnimationFrame detect stop

有没有办法检测何时该停止发生?

原因是,我有一个计时器在我的游戏中运行。当requestAnimationFrame不再呈现时,我想停止计时器。我调查了'window.blur'和'window.focus'事件,但这些与requestAnimationFrame停止和启动时无关(例如,当您在浏览器窗口外单击window.blur事件是但是requestAnimationFrame继续运行)。

我想在requestAnimationFrame开始和停止时订阅。你知道一个方法吗?

回答

1

如果你知道,正常情况下​​火的,比方说,至少4赫兹,可以设置为,比如说,3赫兹一个计时器,如果一直没有​​刻度之间的计时器滴答声中,​​计时器已经停止。

+0

是的。事实证明,这是检测rAF停止/启动时的唯一方式。基本上我正在计算每个渲染之间的毫秒数。如果该数字超过160(相当于6.25 fps),那么我们可以安全地假定用户已经在浏览器中切换了标签或者使用了窗口停靠。 – ChrisRich

1

试试这个:

var timer; 

if (!window.requestAnimationFrame) { 
    window.requestAnimationFrame = window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame; 
} 

requestAnimationFrame(function again() { 
if (timer === "paused") { 
    return; 
} 

clearTimeout(timer); 

timer = setTimeout(function() { 
    timer = "paused"; 
    console.log("got ya, you closed the window"); 

    requestAnimationFrame(function() { 
    timer = null; 
    console.log("got ya, you re-opened the window"); 
    requestAnimationFrame(again); 
    }); 
}, 1e3); 

// rest of code goes here 

requestAnimationFrame(again); 
}); 

需要更多信息?只是问。

+0

我很接近基于RAF的计时器。检查这个小提琴:http://jsfiddle.net/christian1974/Arjje/1/计时器运行良好,它实际上停止了,当我切换标签,但当我回到选项卡,所有的时间从空闲状态/当rAF未运行时,现在突然累计到总时间。你能看到为什么? – ChrisRich