2017-12-05 27 views
2

私はリアルタイムゲームをプレイできないようにするsocket.ioに大きな問題があります。 200msの -ゲームnode.jsとsocket.io(リアルタイム)の大きな遅れ

は私が(各ソケット)

私のNode.jsサーバーが接続されたすべてのクライアントにデータを20msごとを送りたい。しかし、私は、クライアントが20msごとに受信していないことがわかり、それは時間ごとに100に複数の受信しますもっと。ゲームを完全に再生できないようにします(非常に大きな遅れ)

ローカルでは非常にうまく動作します。

お願いします。いくつかのネットワークのボトルネックがあるので、この問題が発生した

function sendData() 
{ 
    playersList.forEach((player) => 
    { 
    let data = []; 
    // code which add data to "data" variable 

    socketsList[player.id].emit('refreshGame', JSON.stringify(data)); 
    }); 

    setTimeout(sendData, 20); 
} 

sendData(); 
+0

私の経験は、コードの複雑さと最適化、noOfPlayersとサーバーの仕様に依存しています。最初にまず冗長性を取り除き、メモリをフラッシュするなど、コードを軽量化してみてください。 – wrangler

+0

関数 'sendData()'に 'emit( 'refreshGame'、 '');を使ってデータを作るコードをすべて削除しても同じです。 'クライアント側でキャンバスをリロードするコードを削除した場合(ちょうど' socket.on( 'refreshGame'、console.log( 'new Date()。getTime()); – Skysork

答えて

0

: は、ここにデータ(サーバ側)を送信し、私の関数のコードの一部です。これは、次の理由で発生します。

  1. 送信されるパケットが非常に大きいです。
  2. 低速ネットワーク。

軽減するには、optimize sending packetsを試してください。IEは必要なデータのみを送信します。たとえば、移動するコンポーネントと移動しないコンポーネントを持つゲームがある場合、移動するコンポーネントを複数回送信する場合でも、移動しないコンポーネントを1回だけ送信します。

もう1つの方法は、このstackoverflow質問の範囲外のネットワークを診断することです。

しかし、これらは「事実」ですが、私自身の経験に基づいてこの問題を解決するように思われるいくつかの従来の調整や小さな調整があります。

  1. emit関数のJSON.stringifyを削除します。 Socket.emitが自動的にこれを行います。
  2. setTimeoutは、最後ではなく、関数の先頭に置きます。

また、socketsList[player.id]がプレーヤーの実際のソケットであることを確認してください。ある時点でsocketsList.spliceを使用すると、間違ったクライアントにパケットを送信することを完全に妨げてしまいます。