2

多くのプレイヤーが同じレベルにいるゲームをプログラムしたいと考えています。2D だけで、最大 65,535 人のプレイヤーがいるとしましょう。レベル内の 1 人のプレーヤーに関する情報のためにクライアントに送信される次のデータを使用します。

8 Bytes - Player ID
8 Bytes - Player X Position
8 Bytes - Player Y Position
8 Bytes - Player Rotation

65,535 人のプレーヤーの 32 バイトは、レベル内のすべてのプレーヤーの 1 回の更新で 2,097,120 バイト (約 2 MB) を意味します。これが 30fps で発生すると、60MB/秒が必要になります。では、帯域幅の使用量を抑えて 1 つのレベルで多くのプレイヤーを処理するにはどうすればよいでしょうか?

ありがとう

4

3 に答える 3

1

いくつかのこと:

1)一般的に、すべてのプレーヤーが他のすべてのプレーヤーを同時に見るわけではありません。これを最適化するには、特定の距離内のプレーヤーにのみデータを送信します(おそらく、視界の端の周りの動きをスムーズにするために、プレーヤーが見ることができる距離よりも少し広いです。

2)ゲームが30 fpsで実行されているからといって、サーバーから30アップデート/秒を受信する必要があるわけではありません。頻度の低い更新を送信し、その間のフレームを補間することができます。レイテンシーは変動するため、すでにその一部を実行する必要があります。

3)変更された情報のみを送信する必要があるため、更新があった場合は、変更がないと想定します。たまに(5秒ごとなど)、変更が発生したかどうかに関係なく、失われたパケットを考慮して、表示されているデータの完全なセットを送信しますが、問題が発生し始めた場合にのみ送信してください。

于 2012-09-01T17:43:58.563 に答える
1

通常、ほとんどのプレーヤーは他のプレーヤーを見ることができません。

プレーヤーが見ることができる(または見ることができるようになる)プレーヤーの更新のみをプレーヤーに送信します。

于 2012-09-01T17:31:10.353 に答える
1
  • 65,535 人のプレイヤーの場合、2 バイトの id-variable が必要です。
  • 最小回転角度が 0.005 度の場合、0 ~ 360 度の範囲で 2 バイトが必要です。

つまり、20バイトです(現在、データの37%削減)。

プレーヤーが動いたり回転したりしていない場合、X、Y、または回転データを送信する必要はありませんよね? 1 バイトの情報提供者を「X を更新する必要がない」または「回転する必要がない」または「プレーヤーをオフラインにする」として追加できます。

X、Y 変数に 32 ビット整数を使用して、浮動小数点バリアントが次の整数値に丸められたときにのみ更新することもできます (これは物理ゲームではありませんか?)。

すべてのプレイヤーが他のプレイヤーの位置のキャッシュを持ち、動かないときはキャッシュを使用するようにゲームを設計します。

空間インデックス/octreeを使用して、近くのプレーヤーをグループ化して、近くのプレーヤーの更新を高速化できます (他のプレーヤーは不要な場合は更新しません (プレーヤーの視界範囲は?))。

于 2012-09-01T17:22:06.430 に答える