Javascript 即使用户处于不同的选项卡中,window.setTimeout也需要工作

Javascript 即使用户处于不同的选项卡中,window.setTimeout也需要工作,javascript,jquery,focus,settimeout,requestanimationframe,Javascript,Jquery,Focus,Settimeout,Requestanimationframe,因此,我正在制作一款游戏,它可以随着时间的推移获得积分,即使用户并没有真正关注游戏运行的窗口。我在javascript中使用setTimeout()和requestAnimationFrame()函数,遇到了一个问题 //main game loop var FPS = 30; tick(); function tick() { setTimeout(function() { window.requestAnimationF

因此,我正在制作一款游戏,它可以随着时间的推移获得积分,即使用户并没有真正关注游戏运行的窗口。我在javascript中使用setTimeout()和requestAnimationFrame()函数,遇到了一个问题

    //main game loop
    var FPS = 30;
    tick();
    function tick() {
        setTimeout(function() {
            window.requestAnimationFrame(tick);
            //draw everything
            draw();
            //do stuff
            ...stuff...
        }, Math.round(1000/FPS));
    }
我遇到的问题只有在用户关注其他选项卡时才会出现。如果窗口被收起,或者如果另一个窗口在上面,游戏仍然运行。这告诉我它与操作系统无关,而与浏览器无关。我发现它在浏览器中也是通用的。我需要游戏运行,即使玩家正在使用另一个标签,我如何做到这一点?如果有一个特定于更改选项卡的事件,或者如果有一个替代的、可靠的计时器功能,那就好了


提前感谢:)

下面是一个示例web worker,当选项卡被隐藏时,它将每秒运行一次以上。不幸的是,并非所有浏览器都支持web Worker

var blob = new Blob([
    "onmessage = function(e) { setTimeout(function(){postMessage('draw now'); },100)}"]);

// Obtain a blob URL reference to our worker 'file'.
var blobURL = window.URL.createObjectURL(blob);

var worker = new Worker(blobURL);
worker.onmessage = function(e) {
  draw();
  worker.postMessage('start timer');
};
worker.postMessage('start timer'); // Start the worker.
这里的工作示例。打开控制台以观察计数增量,即使您的选项卡处于隐藏状态


浏览器在隐藏选项卡时将setTimeout调用限制为每秒最多1次,以最大限度地提高活动选项卡上的性能:如果目标浏览器支持web worker,则可以在web worker中运行超时功能并绕过此限制。