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 中 MongoDB cursor.toArray() 的替代方案
将 Node.js+Socket.io 包装成 OSX 可执行文件的可靠方法? (或用作替代品的 C/C++/Objective-C 库)