UDN
Search public documentation:

ReplicationVariableReplicationNotesJP
English Translation
中国翻译
한국어

Interested in the Unreal Engine?
Visit the Unreal Technology site.

Looking for jobs and company info?
Check out the Epic games site.

Questions about support via UDN?
Contact the UDN Staff

UE3 ホーム > ネットワーク & レプリケーション > 変数レプリケーションのためのノート

_UDK での前回テスト 2011年3月_

変数レプリケーションのためのノート


概要


ゲーム内で変数のレプリケーションを処理する場合、従わなければならない特別なルールがいくつかあります。

ベクター


ベクターは、最も近い値に丸められた符号付き整数 3 個としてネットワークを通じて送信されます。レプリケートされたベクターの取り得る範囲は、(X=-1048576.f, Y=-1048576.f, Z=-1048576.f) から (X=1048575.f, Y=1048575.f, Z=1048575.f) までとなります。これを超える値や、これに満たない値は、送信時にクランプされます。

精度を高めるか、値の範囲を拡げなければならない場合は、3 つの float 型をもつ構造体を独自に作るか、あるいは、単に各成分を別々に送信します。

ベクターのレプリケーション テスト

以下は、サーバーが、変更した値をクライアントにレプリケートする場合に、クライアントが受け取るものです。ベクター (Vector; 赤) に小数点以下の部分がないのが分かります。他の構造体内で使用されているベクター (TwoVectors; 緑) も、同じビヘイビアをします。 ベクター (Vector4; 黄 および Vector2D; 青) のように見える構造体は、ベクターと同じようには圧縮されません。したがって、完全な精度および標準的な 32 ビットの数値範囲で送信されます。

VectorReplicationClientConsoleWindow.png

以下は、サーバーが全クライアントに送信しているものです。

VectorReplicationServerConsoleWindow.png

ローテータ


ローテータ (Rotator) は、3 つの符号なしバイトとしてネットワークを通じて送信されます。したがって、転送される最小の単位は、256 Unreal 単位回転、すなわち 1.406250 度、または 0.024543 ラジアンとなります。精度はいくらか落ちますが、その差は非常に小さいため現実的に見分けがつきません。

成分毎の計算はつぎのようになります。 replicated_component = (component >> 8) & 255 (訳注 : ここで、replicated_component は、「レプリケートされた成分」を意味し、component は「成分」を意味します)。これによって、あらゆる値 (正または負の値) が 0 から 255 の範囲の値に変換されます。受信側では、つぎの計算が実行されます。 component = (replicated_component << 8).

精度をこれ以上高める場合は、3 つの整数をもつ構造体を独自に作るか、単に各成分を別々に送信します。

ローテータのレプリケーション テスト

以下は、サーバーが、変更した値をクライアントにレプリケートする場合に、クライアントが受け取るものです。ローテータの成分が前述した変形を施されて送信されていることが分かります。クライアントがこのレプリケートされた値を受け取ると、それらの値はクライアント上で変形されます。

RotatorReplicationClientConsoleWindow.png

以下は、サーバーが全クライアントに送信しているものです。 ダブルチェックすると、RotatorTest は次のようになります。

  • RotatorTest.Pitch (RotatorTest. のピッチ)
    • 59467 >> 8 == 232
    • 232 & 255 == 232
    • 232 << 8 == 59392
  • RotatorTest.Yaw (RotatorTest のヨー)
    • 9170 >> 8 == 35
    • 35 & 255 == 35
    • 35 << 8 == 8960
  • RotatorTest.Roll (RotatorTest. のロール)
    • -12242 >> 8 == -48
    • -48 & 255 == 208
    • 208 << 8 == 53248

RotatorReplicationServerConsoleWindow.png

構造体


構造体は、ネットワークを通じて一度に送信されます。ベクターやローテータと異なり、他の方法で特に圧縮されることはありません。構造体は、一度にすべて送信されるか、まったく送信されないかのどちらかです。したがって、構造体の単一の成分を更新してその変更分だけを送信するということは不可能です。ただし、個々の変数を送信して構造体の中に合成すれば、手動で部分的な更新を実現することは可能です。それゆえ、大きな構造体をレプリケートする場合は、注意を要します。

構造体のレプリケーション テスト

以下は、サーバーが、変更した値をクライアントにレプリケートする場合に、クライアントが受け取るものです。あらゆる変数が一度に更新されていることが分かります。

StructReplicationClientConsoleWindow.png

以下は、サーバーが全クライアントに送信しているものです。

StructReplicationServerConsoleWindow.png

静的配列


静的配列は、変更された値だけを送信することができるため、ネットワークを通じて効率的に送ることができます。ただし、静的配列が構造体の中にある場合は、構造体の「オールオアナッシング」ルールによってこのルールがオーバーライドされてしまいます。したがって、構造体内部では大規模な静的配列を避けるべきです。一個の配列の値が変更されていても、構造体全体が送信されるからです。

レプリケートされる静的配列は、448 バイト未満でなければなりません。この制約のため、構造体の静的配列のなかには送信できないものがあります。

静的配列のレプリケート通知は、最初のレプリケーションの更新時にしか機能しません。それ以降、静的配列のレプリケーションが更新されても、ReplicatedEvent は呼び出されません。ただし、他のレプリケーションが通知される変数が ReplicatedEvent を呼び出すと、静的配列も ReplicatedEvent を呼び出します。構造体内の静的配列はつねに ReplicatedEvent を呼び出します。したがって、静的配列が ReplicatedEvent を適切なときに呼び出さない場合は、bool 型を同時にレプリケートすることによって、ReplicatedEvent が呼び出されるようにします。

配列のレプリケーション テスト

以下は、クライアントがサーバーから受け取るものです。

ArrayReplicationClientConsoleWindow.png

以下は、サーバーが全クライアントに送信しているものです。

ArrayReplicationServerConsoleWindow.png

動的配列


動的配列はまったくレプリケートされません。アクタの動的配列を送信する必要がある場合は、リンクされたリストを使用します。そうでなければ、独自のレプリケーションメソッドを作らなければなりません。リモートプロシージャコールによって実現するメソッドがありますが、使用できる帯域幅に過負荷をかけてしまいがちです。したがって、動的配列は、レプリケーションではない場合のために残しておくべきでしょう。

ダウンロード


  • ソースコードは、 ここ からダウンロードすることができます。 (ReplicationVariableExample.zip)