前置きなど 全般 負荷・帯域を減らす超基本 ネットワーク基本 サーバ設計 クライアント設計 ネットワーク通信量 ゲームシステム設計 同期の問題 セキュリティ テスト・デバッグ プログラミングテクニック

ネットワーク通信量

 個人でMMOを作る際にはネットワーク帯域は限られています。 企業が運営する場合でもネットワークの帯域は コストに大きく影響するでしょう。
 このページではネットワークの通信量を削減する方法について説明します。
up
down

メッセージのサイズ

 まず思いつくことは、メッセージのサイズそのものを減らすことだと思います。
 例えば整数値を送信する際に、通常変数として4Byte使っているところを、 必要最小限の2Byteとか1Byteにするとかして通信量を抑えます。

 さらに、実際に送受信される値の範囲を考慮することでも、 より小さい通信量で済む場合があります。
 例えば位置の情報を送受信する場合を考えます。 もともと絶対位置では4Byte必要だったとしても、 実際には送受信が送信するキャラ周辺のみ±100の範囲でしか発生しない、とかはよくあります。 このような場合には、下位1Byteのみ送受信しても元の位置を逆算できます。

 また、メッセージの構造体のアラインメントを1Byteにすれば無駄が無くなります。
 ただし、変数が2Byteや1Byteであったり、アラインメントが1Byteであると、 演算速度が低下することもありますので、 アラインメントを詰めるのは送受信の時のみにした方が良いでしょう。
up
down

パケット数

 以上のようにメッセージサイズを小さくすると、 特に多く発生する移動やアクションについては10Byte以下になるのではないでしょうか。 しかし、コツコツ削っても、実際にはそれほど効果が無かったりします(´Д`;)
 なぜならば実際にネットワークで送受信される際にTCP・IPヘッダがつくからです。 TCP・IPのヘッダはあわせて40バイト以上になりますので、 20Byte→10Byteになって半減かと喜んでたら、実際は60→50と17%減かもしれません。
 なので、ショートパケットを送る回数が多いMMOにおいては、 パケットの送信回数を減らす、 ということが重要になります。
up
down

パケット数を減らす

 パケットの送信回数を減らすためには、 まず、ゲームシステム自体をそのように設計しておく必要があります。 クライアントの描画が60fpsだからといって、 パケットもフレームごとに、一秒に60回送るようにしてはダメです。 ここらへんについて詳しくはゲームシステム設計のページで書きます。

 後ろ向きの対策として、「何もしない」という方法があります。 メッセージを2回送信したとしても、パケットが2回送信されるとは限りません。 送信を行っても、一端OS側の送信バッファにためられた後送信されますので、 連続して送信されたメッセージは1つのパケットにまとめられる可能性があります。
 通信量が帯域の限界をちょっと超えた場合には、 送信バッファにメッセージがたまっていきますので、 勝手に1つのパケットにまとめられることが期待できます。  なので、何もしなくても、限界付近で多少粘ってくれるかも...

 フレーム単位でゲーム処理を行っている場合には、 フレーム単位でメッセージの送信を行うのが良いでしょう。
 送信メッセージが発生してもすぐに送信せず、バッファにためておき、 1つのフレームの処理が終わった時点でまとめて送信すれば、 1フレームごとにパケットがまとめられます。

優先度によって遅延、パケットをまとめる  メッセージの種類によって、すぐに送信する必要があるものもあれば、 多少遅れても概ね問題無いものもあると思います。
 右図を参照してください。
 メッセージごとに最大遅延時間を設定し、 それまではメッセージをバッファにためておきます。 そして、遅延時間がきたら送信します。 その時にバッファにたまっているメッセージがあれば、 (遅延時間になっていなくても)一緒に送信します。
 以上のようにすれば、 必要なレスポンスを維持しながらパケットをまとめることができます。
前置きなど 全般 負荷・帯域を減らす超基本 ネットワーク基本 サーバ設計 クライアント設計 ネットワーク通信量 ゲームシステム設計 同期の問題 セキュリティ テスト・デバッグ プログラミングテクニック
footer
footerページ先頭上の項目前ページ次ページtop
footer