March 31, 2014

ネットワークに関するヒントと秘訣

作成 John Pollard

基本的なプロパティのレプリケーション

今回は、ネイティブ コードでレプリケートされたプロパティを処理する場合に役立つ秘訣をいくつかお話ししたいと思います。

プロパティをレプリケートする方法について説明し尽くすことは、今回の記事の範囲から外れますので、基本事項についてざっと見て行くことにしましょう。

プロパティをレプリケートするには、以下のことが必要となります。

プロパティが定義されている Actor クラスのヘッダに、UPROPERTY 宣言の引数の 1 つとして replicated キーワードを入れます。

class ENGINE_API AActor : public UObject

{

UPROPERTY( replicated )

AActor * Owner;

};

Actor クラスの実装では、GetLifetimeReplicatedProps 関数を実装します。

void AActor::GetLifetimeReplicatedProps( TArray< FLifetimeProperty > & OutLifetimeProps ) const

{

DOREPLIFETIME( AActor, Owner );

}

Actor のコンストラクタで、bReplicates フラグを true にセットします。

AActor::AActor( const class FPostConstructInitializeProperties & PCIP ) : Super( PCIP )

{

 

bReplicates = true;

}

大体こんなところでしょうか。これで、メンバー変数の Owner は、現在インスタンス化されているこの Actor 型 (この場合、ベースの Actor クラス) のあらゆるコピーのために接続されているすべてのクライアントと同期します。

条件付きプロパティのレプリケーション

いったんプロパティがレプリケーションのために登録されると、登録を外すことはできません (ライフタイムの部分はこのことに基づきます)。その理由は、できるだけ多くの情報を組み入れることによって、同一セットのプロパティのために接続されている多数のクライアント間で作業を分配することができるからです。計算時間をかなり節約できるわけです。

では、このプロパティのレプリケーションをより細かく制御するにはどうしたらよいでしょうか?そこで出てくるのが、条件付きプロパティです。

デフォルトでは、レプリケートされた各プロパティは、固有の条件をもっていて、それらが変化していない場合は、レプリケートされないということになります。

プロパティのレプリケーションをより緻密に制御するためには、第二の条件を加えることができる特別なマクロがあります。

このマクロは、DOREPLIFETIME_CONDITION という名前が付いています。以下にその使用例を挙げてみます。

void AActor::GetLifetimeReplicatedProps( TArray< FLifetimeProperty > & OutLifetimeProps ) const

{

DOREPLIFETIME_CONDITION( AActor, ReplicatedMovement, COND_SimulatedOnly );

}

COND_SimulatedOnly フラグが条件マクロに渡され、レプリケーション対象のプロパティが評価される前であっても、追加の条件チェックが実行されるようになります。この場合は、このアクタのシミュレートしているコピーをもつクライアントにのみレプリケートされます。

こうすることには大きなメリットがあります。それは帯域幅が節約できるということです。このアクタの自律的なプロキシバージョンをもつクライアントが、このプロパティを認識する必要はないと定めたからです (このクライアントは、たとえば、予測目的でこのプロパティを直接セットしています)。