2015-09-15 6 views
8

私の設定は、ソケットを非同期転送データとするマルチプレイヤーゲームです。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); 
} 
+0

'update()'には約100msしかかかりません。これをどのようにベンチマークしましたか?そして、それは200人のプレーヤーとの全体のループが100msかかりますか、または "更新"の1回の呼び出しが100msかかりますか? – basilikum

+0

こんにちは、プレイヤーのアップデートはすべて100ms未満ですが、私のポイントはちょうどそれがインターバル時間を超えていないことに注意することでした。私はDate.now()の違いでそれを測定しました –

+0

あなたはそれをどのように測定したのかをコードで表示できますか?私は確信が持たれていませんが、これらの大きな違い(500msから1000msまで)を考えてみると、ベンチマークが間違っていて、実際にループを実行するのに500ms以上かかる場合があります。 – basilikum

答えて

1

私はゲームでは動作しませんがhereを示すように、のsetIntervalより良い代替手段は、そこにあります。ビジネスアプリケーションではうまくいきました。私はこれが役立つことを願っています

2

ここではsetTimeout()setImmediateの組み合わせを使用してaccurate node.js game loopを作成する記事です。そのため正確なことですが、あまりにも多くのCPUを使い果たしません。

nanoTimer timing libraryが役立ちます。 readmeから同様のアプローチを使用しているように聞こえます。私はそれがゲームで心に設計されているかどうかは分かりませんが、試してみる価値があります!

関連する問題