私の設定は、ソケットを非同期転送データとするマルチプレイヤーゲームです。Node.js:ゲームループでより正確なsetIntervalに代わるもの
ゲームの性質上、プレイヤーの更新(例:位置、外観、...)を行うたびに500msごとにチェックする必要があります。
var self = this;
this.gameLoop = setInterval(function()
{
for (var i = 0; i < playerSize; i++)
{
self.players.get(i).update();
};
}, 500);
私は現在setInterval
を使用していますが、私は、約200の接続を持ついくつかのベンチマークをしたとき、setInterval
は、ゲーム全体がラグ見えますこれは、代わりに500ミリ秒の1000ミリ秒に離れて漂流。また、残念なことに、プレイヤーの少量で正確ではありません。 (更新呼び出しは最大約100msしかかかりません)
私が研究した結果、タイミングメカニズムだけを処理するプロセスを起動することはできませんでした。それとも他の選択肢がありますか?
誰でもこれをやったことがありますか?
全コード:
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()'には約100msしかかかりません。これをどのようにベンチマークしましたか?そして、それは200人のプレーヤーとの全体のループが100msかかりますか、または "更新"の1回の呼び出しが100msかかりますか? – basilikum
こんにちは、プレイヤーのアップデートはすべて100ms未満ですが、私のポイントはちょうどそれがインターバル時間を超えていないことに注意することでした。私はDate.now()の違いでそれを測定しました –
あなたはそれをどのように測定したのかをコードで表示できますか?私は確信が持たれていませんが、これらの大きな違い(500msから1000msまで)を考えてみると、ベンチマークが間違っていて、実際にループを実行するのに500ms以上かかる場合があります。 – basilikum