我的设置是一个多人游戏,带有用于异步传输数据的套接字。
现在由于游戏的性质,我有一个游戏循环,应该每隔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);
}
答案 0 :(得分:2)
以下是一篇关于使用setTimeout()
和accurate node.js game loop的组合创建setImmediate
的文章,因此事情准确但不会占用太多CPU。
nanoTimer timing library可能适合您。从自述文件中可以看出它使用了类似的方法。我不知道它是否设计了游戏,但值得一试!
答案 1 :(得分:1)
虽然我不使用游戏,但有一个比setInterval更好的选择,如here所示。它在商业应用程序中对我很有用。我希望这会有所帮助。