Node.js:替代setInterval,这对于游戏循环来说更加精确

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

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

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

我目前正在使用setInterval但是当我做了大约200个连接的基准testing时, setInterval漂移到了1000ms,而不是500ms,这使得整个游戏显得很迟钝。 不幸的是,less量的玩家也不够准确。 (注意更新电话最多只需要100ms左右)

所以在研究之后,似乎没有别的办法可以产生一个只处理时间机制的过程呢? 还是有其他的select?

任何人都曾经这样做过,或者可以就如何做到这一点提供一些基本的想法/解决scheme?

完整代码:

 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); } 

这里是一篇关于使用setTimeout()setImmediate的组合创build一个精确的node.js游戏循环的文章,所以事情是准确的,但不要使用太多的CPU。

nanoTimer时序库可能适合您。 从自述,它听起来像它使用了类似的方法。 我不知道它是否devise了游戏,但它应该值得一试!

尽pipe我不使用游戏,但是比setInterval有更好的select,如下所示。 它在商业应用程序中运行良好。 我希望这有帮助。