Unityネットワーキングサーバのカスタム構築
携帯機器でのネットワーク機能

ネットワーク帯域幅の最小化

Suggest a change

Success!

Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable.

Close

Sumbission failed

For some reason your suggested change could not be submitted. Please try again in a few minutes. And thank you for taking the time to help us improve the quality of Unity Documentation.

Close

Cancel

ゲームの他の部分と比較するとネットワーク通信は遅いため,最小に抑えることが重要です。このため,データ交換を行っている量や発生の頻度を考慮することがとても重要です。

データが同期される方法

使用されるネットワーク帯域幅はUnreliable(非信頼)かReliable Delta Compression(信頼差分圧縮),どちらのモードを使用してデータの同期を行っているかに大きく依存します。(モードはNetwork Viewコンポーネントからセットします)

In Unreliable mode, the whole of the object being synchronized will be transmitted on each iteration of the network update loop. The frequency of this update is determined by the value of Network.sendRate, which is set to 15 updates per second by default. Unreliable mode ensures frequent updates but any dropped or delayed packets will simply be ignored. This is often the best synchronization mode to use when objects change state very frequently and the effect of a missed update is very short-lived. However, you should bear in mind the amount of data that might be sent during each update. For example, synchronizing a Transform involves transmitting nine float values (three Vector3s with three floats each), which equates to 36 Bytes per update. If the server is running with eight clients and using the default update frequency then it will receive 4,320 KBytes/s (8*36*15) or 34.6Kbits/s and transmit 30.2 KBytes/s (8*7*36*15) or 242Kbits/s. You can reduce the bandwidth consumption considerably by lowering the frequency of updates, but the default value of 15 is about right for a game where the action moves quickly.

Reliable Delta Compressedモードでデータは信頼性をもって正しい順番で受信されることが保証されてます。もしパケットを逸失した場合再送信され,順番が正しくない場合,全てのパケットが一連のパケットが全て到着するまでバッファリングされます。これにより送信されたデータが正しく受信されることを保証するものの,この待機および再送信が帯域幅を消費しがちです。しかしデータは差分圧縮され,前回の状態と現在の状態の差分のみが送信されます。もし状態がまったく同一である場合何も送信されません。差分圧縮はどのプロパティがどれだけ変化するかに依存します。

どのデータが同期されるか

全てのクライアントで実際に同じでない状態を同じである_かのように_ゲーム設計を工夫する余地があります。具体例としてはアニメーションを動機する例です。もしアニメーションコンポーネントがNetwork Viewにより発見されると,プロパティは正確に同期され,すべてのクライアントでフレームが同期するようになります。これが望ましいケースもありますが,通常はキャラクターが歩いたり,走ったり,ジャンプしていたり,のどれかで十分です。アニメーションの同期を削るするためにはどのアニメーション シーケンスを再生するかintegerの値を送信して指定するのみです。これによりアニメーション全体を送信するよりネットワーク帯域幅が節約できます。

いつデータの同期をするか

通常,ゲームをすべてのクライアントで完全に同期することは不要で,たとえば,プレイヤーがゲーム世界の別エリアに一時的にいて互いに遭遇することのないケースがあったとします。この場合帯域幅だけでなくサーバの負荷を削減するには,遭遇することが出来るクライアントのみ同期します。このコンセプトはRelevant Sets(関連セット)と呼ばれます(すなわち,特定のクライアントのある特定の時間で,ゲーム全体のうち実際に関連するサブセットが一部ある状態)。クライアント同期をRelevant Setにもとづいて同期させることはRPCによって,同期の更新対象をより強力にコントロールしたうえで,ハンドリングすることが出来ます。

レベルローディング

レベルをロードするときは,通常各クライアントが使用する帯域幅を気にする必要があることは稀で,全てのクライアントがプレイするレベルを初期化できるまで単に待たせれば良いです。レベルローディングはかなり大きなデータアイテムの送信を伴うことがあります(画像や音声データなど)。

Unityネットワーキングサーバのカスタム構築
携帯機器でのネットワーク機能