Node.js:setInterval的替代方案,对游戏循环更精确

时间:2015-09-15 13:55:24

标签: javascript node.js timer game-loop

我的设置是一个多人游戏,带有用于异步传输数据的套接字。

现在由于游戏的性质,我有一个游戏循环,应该每隔500毫秒进行一次玩家更新(例如位置,外观......)。

var self = this;

this.gameLoop = setInterval(function()
{   
    for (var i = 0; i < playerSize; i++)
    {
        self.players.get(i).update();
    };
}, 500);

我目前正在使用setInterval但是当我做了大约200个连接的基准时,setInterval漂移到1000毫秒而不是500毫秒,这使得整个游戏看起来很滞后。不幸的是,对于少量玩家而言,它还不够准确。 (请注意,更新调用最多只需要大约100毫秒)

在研究之后,对我来说似乎没有其他选择来产生只处理定时机制的过程?或者还有其他选择吗?

之前有人这样做过,或者可以就如何做到这一点给出一些基本的想法/解决方案?

完整代码:

Game.prototype.start = function()
{
    var average = 0;
    var cycles = 10;
    var prev = Date.now();

    this.thread = setInterval(function()
    {       
        console.log("interval time="+(Date.now() - prev));
        prev = Date.now();

        var s = Date.now();

        // EXECUTE UPDATES
    for (var i = 0; i < playerSize; i++)
    {
        self.players.get(i).update();
    };

        average += (Date.now() - s);

        cycles--;
        if(cycles == 0)
        {
            console.log("average update time: " + (average/10) + "ms");
            average = 0;
                cycles = 10;
            }
    }, 500);
}

2 个答案:

答案 0 :(得分:2)

以下是一篇关于使用setTimeout()accurate node.js game loop的组合创建setImmediate的文章,因此事情准确但不会占用太多CPU。

nanoTimer timing library可能适合您。从自述文件中可以看出它使用了类似的方法。我不知道它是否设计了游戏,但值得一试!

答案 1 :(得分:1)

虽然我不使用游戏,但有一个比setInterval更好的选择,如here所示。它在商业应用程序中对我很有用。我希望这会有所帮助。

相关问题