2016-07-29 4 views
1

現在、NodeJS + SocketIOを使用してゲームを開発中ですが、送信されるデータの量に問題があります。現在、サーバーは約600〜800 kbpsを送信していますが、これはまったくうまくいきません。ここでNodeJS +ソケットIOがあまりにも多くのデータを送信する

は私のクラスである:

Shape 
    Pentagon 
    Square 
    Triangle 
Entity 
    Player 
    Bullet 

すべてのフレーム(60fpsの)、私はクラスのそれぞれを更新し、各クラスには、クライアントに送信されますupdatePackを持つことになります。 updatePackはかなりシンプルで、オブジェクトのidとcoordsのみを含んでいます。


最初は、みんなのゲームはそんなものだと思っていました。私はagar.io、slither.io、diep.io、rainingchain.comのようないくつかの単純なゲームを調べて、彼らが100kbpsを使用していることを発見しました。

次に、送信されるデータを圧縮してみました。

for(var i in list_containing_all_of_my_sockets){ 
    var socket = list_containing_all_of_my_sockets[i]; 
    data = set_data_function(); 
    socket.emit('some message', data); 
} 

はどのように作ることができ、それはより少ないデータを送信します。Socket.io

に送信するときに、しかし、私はここで

が、私は自分のデータを送信する方法、データを自動的に圧縮されていることが分かりましたか?私が逃した何かがありますか?

答えて

0

たぶんその良くないメッセージは、それが実際に含まれているだけでなく、ネットワークを介して送信されるたびにのみ、いくつかの特定のイベントに

0

を(などの衝突、死亡、スポーンに)それを送信する代わりに、フレームごとにデータを送信するが、これに送信するデータだけでなく、ルーティング、エラー防止などのための追加データもたくさんあります。 あなたはすべてのデータを個々のメッセージで送信しているので、これらの追加情報はそれぞれのメッセージごとに作成します。

代わりに、送信する必要があるすべてのデータを収集し、1つのオブジェクトに保存して、このメッセージを1つのメッセージで送信する必要があります。 道ゲームを考慮し

+0

興味深いですね!試してみましょう、私はあなたに戻ってきます。 – Meinkraft

1

独断答えは、サーバ・クライアントのトラフィックを処理します。これはではありません。答え:

レンダリングはプレゼンテーションの問題です。ゲームの状態に関する単一の情報源であるあなたのサーバーは、ゲームの状態の変更と宣伝にのみ気を付ける必要があります。 60fpsのレンダリングは、サーバー上の問題ではないため、サーバーは(あなたにもちょうどサーバー上で全体をレンダリングし、ビデオストリームとして、それを超える送信する方がよいかもしれません)、すべての移動物体のために毎秒60のアップデートを送信するべきではありません。

クライアントは、ゲームの状態を知っていると60fpsの時に変化するゲームの状態をレンダリングする方法を知っている必要があります。サーバーは、状態の変更または状態を変更するイベントのみをクライアントに送信する必要があります。後者の場合、クライアントは、サーバに知られている状態と連動して状態を変更するために、それらのイベントをどのように適用するかを知るであろう。

たとえば、サーバーは、各オブジェクトの更新された移動ベクトル(または作用力さえ)を送信するだけでよく、クライアントは、現在知られている移動ベクトル+経過時間に基づいて各オブジェクトの座標を計算することができます。

0

オブジェクトの代わりに配列を使用して、キーを省略してサイズを小さくすることができます。 のデータは後でを使うのが難しくなりますが、妥協しなければなりません。

また、それの外観では、Socket.IO can compress dataも利用できるので、それを利用することができます。

を更新すると、Node.jsとSocket.IOを使用していくつかのゲームを作成しました。プロセスは以下の通りです:

{ 
    "player1": {x:5, y:5}, 
    "player2": ... 
    ... 
} 
:ソケットID player1

  1. プレーヤー
  2. Serverがデータを受信し、すべてのプレイヤーのデータを含むオブジェクトに保存します(の座標{x:5, y:5}を言わせて)自分のデータを送信します

  3. サーバーは、そのオブジェクトをplayer1に送信します。

  4. player1はオブジェクトを受信し、そのデータを使用して他のプレーヤーを視覚化します。

基本的には、プレイヤーがデータを受信彼は彼自身を送信した後にのみ。この方法では、彼のブラウザがクラッシュした場合、あなたは彼にデータを砲撃しません。それ以外の場合、ユーザーのブラウザがハングアップしている間に15回の更新を送信した場合、15回の更新を処理するために時間が必要です。 その時、あなたはさらに更新を送信するので、ブラウザがそれらを処理するためにさらにの時間を必要とします。この雪玉は災害になります。

プレイヤーは唯一の彼自身を送信した後、データを受信した場合、あなたは次のことを確認してください

  1. を送信するプレイヤーは、彼は、サーバーの60回を待たないことを意味し、すぐ他のプレイヤーのデータを取得します-per-secondアップデート。
  2. プレーヤーのブラウザがクラッシュした場合でも、データは送信されなくなり、もはや視覚化できないため受信できなくなります。
関連する問題