Node.js:setInterval 的替代品,更适合游戏循环

Posted

技术标签:

【中文标题】Node.js:setInterval 的替代品,更适合游戏循环【英文标题】:Node.js: alternative to setInterval which is more precise for game loop 【发布时间】:2015-09-15 13:55:23 【问题描述】:

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

现在由于游戏的性质,我有一个游戏循环,它应该每 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);

【问题讨论】:

你说update()只需要大约100毫秒。您如何对此进行基准测试?这是否意味着 200 名玩家的整个循环只需要 100 毫秒或一次调用 update 需要 100 毫秒? 您好,所有播放器的更新时间都小于100ms,我的意思是要注意不超过间隔时间。我用 Date.now() 差异测量它 你能用代码显示你是如何测量它的吗?我不确定,但考虑到这些巨大的差异(从 500 毫秒到 1000 毫秒),我认为基准测试可能不正确,并且您的循环实际上需要更多的时间然后 500 毫秒才能执行,这使得间隔变得更长并且可能重叠。 我已经更新了我的帖子。 好的,看起来不错。可能与此有关:***.com/questions/5927284/… 【参考方案1】:

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

nanoTimer timing library 可能对您有用。从自述文件听起来它使用了类似的方法。我不知道它是否是为游戏设计的,但应该值得一试!

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于Node.js:setInterval 的替代品,更适合游戏循环的主要内容,如果未能解决你的问题,请参考以下文章

Node.js 在生产中是不是有永远和连接的 vhosts / nginx 替代方案?

Node.JS 寻找 socket.IO 的替代方案

Node.js 主机名/IP 与证书的替代名称不匹配

node.js 中 MongoDB cursor.toArray() 的替代方案

在 Node JS 中管道远程文件寻找替代方法

将 Node.js+Socket.io 包装成 OSX 可执行文件的可靠方法? (或用作替代品的 C/C++/Objective-C 库)