アクタのレプリケーション は、ネットワーク ドライバー (Net Driver) が、どのアクタをどの接続にどのような順序でレプリケートするかを決定する、詳細な複数のステップで構成されるプロセスです。このページでは、アクタのレプリケーション プロセスの概要について説明します。
アクタのレプリケーションの大部分は、UNetDriver::ServerReplicateActors
関数内で行われます。ここでサーバーはまず、各クライアントに関連していると特定したすべてのアクタを収集し、各接続クライアントの前回の更新以降に変更されたすべてのプロパティを送信します。その後、UActorChannel::ReplicateActor
関数が特定のチャンネルへのアクタのレプリケーションの詳細を処理します。
重要なプロパティ
アクタがどのように更新されるかに関する定義済みのフロー、呼び出される特定のフレームワーク コールバック、および現在のサーバー ティック中にアクタがレプリケートされるかどうかを決定するために使用されるプロパティがあります。重要なプロパティには以下のものがあります。
プロパティ | 説明 |
---|---|
AActor::NetUpdateFrequency |
アクタがレプリケートされる頻度を決定します。 |
AActor::PreReplication |
レプリケーションの実行前に呼び出されます。 |
AActor::bOnlyRelevantToOwner |
このアクタがオーナーにのみレプリケートする場合は true です。 |
AActor::IsRelevancyOwnerFor |
bOnlyRelevantToOwner が true の場合に関連性を特定します。 |
AActor::IsNetRelevantFor |
bOnlyRelevantToOwner が false の場合に関連性を特定します。 |
AActor::NetDormancy |
アクタが休止状態かアウェイク状態かを特定します。 |
アクタのレプリケーション フローの概要
以下の手順は、アクタのレプリケーション プロセスの概要です。
- どのアクタがレプリケートされているかを特定し、休止状態、更新頻度、および所有している接続を特定するためのチェックを実行します。
- これらのチェックに合格したアクタをレプリケーション対象となるリストに追加します。
- 各接続をループし、現在のアクタと接続に基づいてチェックを実行します。この手順の最後に、各接続でレプリケーションの対象となるアクタのリストがあります。
- 各接続の優先順位でアクタを並べ替えます。
- アクタがこの接続に対して適切であるかどうかを決定します。
- 現在の接続にアクタをレプリケートします。
次のセクションでは、上記のアクタ レプリケーション フローの概要の各ステップについて、詳しく説明します。
レプリケーション対象リストにアクタを追加する
このステップでは、すべてのアクタに対して最初のパスを実行し、アクタに対して AActor::SetReplicates(true)
が呼び出されたかどうかをチェックすることで、アクティブにレプリケートしているアクタを特定します。アクティブにレプリケートしている各アクタについて、NetDriver は以下のチェックを実行します。
- 現在のアクタが最初は休止状態 (
ENetDormancy::DORM_Initial
) であるかどうかを特定します。- 最初に休止状態の場合は、このアクタをスキップします。
AActor::NetUpdateFrequency
値をチェックして、現在のアクタを更新する必要があるかどうかを特定します。- 必要ない場合は、このアクタをスキップします。
AActor::bOnlyRelevantToOwner
が true の場合、所有する接続のビューアでAActor::IsRelevancyOwnerFor
を呼び出すことで、このアクタの所有する接続の関連性をチェックします。- 関連性がある場合、その接続の所有されている関連リストに追加します。
- この場合、このアクタは単一の接続にのみ送信します。
これらの初期チェックに合格したアクタでは、AActor::PreReplication
が呼び出されます。AActor::PreReplication
で、特定の接続に対してプロパティをレプリケートするかどうかを特定できます。アクタのレプリケート先の接続を具体的に制御するには、DOREPLIFETIME_ACTIVE_OVERRIDE
マクロを使用します。アクタが上記のすべてのチェックに合格したら、そのアクタをレプリケーション対象リストに追加します。
各接続をループする
次に、システムは各接続をループし、現在の接続の前のステップでレプリケーション対象リストにある各アクタに対して、以下のチェックとアクションを実行します。
AActor::NetDormancy
を呼び出して、現在のアクタが休止状態かどうかを特定します。- このアクタがこの接続で休止状態の場合、このアクタをスキップします。
- チャンネルがまだ存在しない場合は、以下を実行します。
- 現在のアクタがあるレベルをクライアントがロードしたかどうかを特定します。
- レベルがロードされていない場合は、このアクタをスキップします。
- 現在のアクタがその接続での
AActor::IsNetRelevantFor
の呼び出しに関連しているかどうかを特定します。- アクタが関連しない場合は、このアクタをスキップします。
- 現在のアクタがあるレベルをクライアントがロードしたかどうかを特定します。
接続が所有する関連リストに、上記のアクタを追加します。この時点では、休止状態になっていないこの接続に関連するアクタのリストがあります。このリストのアクタを優先度 (AActor::GetNetPriority
) で降順に並べ替えます。アクタを優先度で並べ替えることは、特に多数のアクタが対象となり、接続が飽和状態になる可能性がある場合に、優先度が最も高いアクタが優先度の低いアクタよりも先にレプリケーションの対象となるようにする必要があるため、特に重要です。
ソートされたアクタ リストをループする
この接続のレプリケーション対象リスト内の各アクタで、以下を実行します。
- 接続でこのアクタがあるレベルがロードされていない場合は、チャンネル (ある場合) を閉じて続行します。
AActor::IsNetRelevantFor
を呼び出すことで、アクタが接続に関連しているかどうかを 1 秒ごとに特定します。- 5 秒間関連性がない場合は、チャンネルを閉じます。
- 関連性があり、チャンネルが開かれていない場合は、チャンネルを開きます。
- いずれかの時点でこの接続が飽和している場合:
- 残りのアクタで以下を実行します。
- 関連性が 1 秒未満の場合、次のティックで更新を強制します。
- 1 秒以上関連性がある場合、次のティックを更新すべきかどうかを特定するために
AActor::IsNetRelevantFor
を呼び出します。
- 残りのアクタで以下を実行します。
上記すべてに合格したアクタでは、UActorChannel::ReplicateActor
への呼び出しにより、アクタを接続にレプリケートします。
UNetDriver::ServerReplicateActors
が呼び出しごとにレプリケートするクライアントの数は、いくつかの方法で制御できます。
- エンジンの設定とコマンドライン引数:
-limitclientticks
コマンドライン引数でプロジェクトを起動します。[/Script/Engine.Engine]
エンジン構成カテゴリのNetClientTicksPerSecond
の値を変更します。
- コマンドライン引数:
- コマンドライン引数
-limitclientticks -ini:Engine:[/Script/Engine.Engine]:NetClientTicksPerSecond=<VALUE>
でプロジェクトを起動します。ここで、<VALUE>
は使用する 1 秒あたりのクライアント ティック数です。
- コマンドライン引数
- コンソール変数:
net.MaxConnectionsToTickPerServerFrame
コンソール変数を設定します。
詳細については、「UNetDriver::ServerReplicateActors_PrepConnections
」を参照してください。
アクタを接続にレプリケートする
UActorChannel::ReplicateActor
は、アクタとそのすべてのコンポーネントを接続にレプリケートする主要メソッドです。フローは次のようになります。
- このアクタ チャネルが開かれて以降の最初の更新であるかどうかを特定します。
- 最初の更新である場合は、必要な特定の情報 (初期位置、回転など) をシリアル化します。
- この接続がこのアクタを所有しているかどうかを特定します。
- 所有されておらず、このアクタの役割が
ENetRole::ROLE_AutonomousProxy
である場合は、ENetRole::ROLE_SimulatedProxy
にダウングレードします。
- 所有されておらず、このアクタの役割が
- このアクタの変更されたプロパティをレプリケートします。
- 各コンポーネントの変更されたプロパティをレプリケートします。
- 削除されたコンポーネントで、特別な delete コマンドを送信します。
リストのアクタをすべて処理するか、チャンネルが飽和状態になった後、次の接続が検討され、すべての接続が更新されるまでこのプロセスが繰り返されます。
詳細情報
アクタ レプリケーションの詳細については、Unreal Engine ソース コードの以下のヘッダ ファイルを参照してください。
/Engine/Source/Runtime/Engine/Classes/Engine/NetDriver.h
UNetDriver::ServerReplicateActors
についての情報。
/Engine/Source/Runtime/Engine/Classes/GameFramework/Actor.h
AActor
およびその関数とプロパティに関する情報。
/Engine/Source/Runtime/Engine/Classes/Engine/ActorChannel.h
UActorChannel
およびUActorChannel::ReplicateActor
に関する情報。
/Engine/Source/Runtime/Engine/Classes/Engine/EngineTypes.h
ENetRole
およびENetDormancy
などの型に関する情報。