アクタレプリケーションの大半は UNetDriver::ServerReplicateActors
内部で発生します。ここは、各クライアントと関わりがあると判断されたすべてのアクタをサーバーが収集する場所です。各送信先クライアントが最後に更新されてから変更したプロパティを、送信する場所でもあります。
アクタの更新方法、起動する特定のフレームワークコールバック、そして処理中に使用する特定プロパティに関するフロー定義があります。以下が重要なフロー定義です:
AActor::NetUpdateFrequency
- アクタをレプリケートする頻度の判断に使用するAActor::PreReplication
- レプリケーションが発生する前に呼び出すAActor::bOnlyRelevantToOwner
- このアクタをオーナーだけにレプリケートする場合は trueAActor::IsRelevancyOwnerFor
- bOnlyRelevantToOwner が true の時、関連性の判断に呼び出すAActor::IsNetRelevantFor
- bOnlyRelevantToOwner が false の時、関連性の判断に呼び出す
ハイレベルなフローは以下のようになります:
- 能動的にレプリケートしているそれぞれのアクタをループ処理 (
AActor::SetReplicates( true )
)- このアクタが最初にドーマント (
DORM_Initial
) かどうかを判断して、その場合はすぐにスキップ - NetUpdateFrequency 値をチェックしてアクタの更新が必要かどうかを判断、必要ない場合はスキップ
AActor::bOnlyRelevantToOwner
が true の場合は、所有している接続先のビューアーにAActor::IsRelevancyOwnerFor
を呼び出して、このアクタが所有している接続先との関連性をチェック関連性がある場合は、接続が所有する関連リストに追加する- この場合、このアクタを 1 つの接続先のみに送信する
- 初回チェックが通過するアクタには
AActor::PreReplication
が呼ばれる- PreReplication は接続先にプロパティをレプリケートするかどうかを判断する場所である判断には
DOREPLIFETIME_ACTIVE_OVERRIDE
を使用する
- PreReplication は接続先にプロパティをレプリケートするかどうかを判断する場所である判断には
- 上記をパスした場合は可能性リストに追加する
- このアクタが最初にドーマント (
- 各接続に対して:
- 上記より考慮する各アクタに対して
- ドーマントかどうかを判断する
- まだチャンネルがない場合
- クライアントはアクタが存在するレベルをロードしたかどうかを判断する
- ロードしていない場合はスキップする
- 接続に
AActor::IsNetRelevantFor
を呼び出してアクタに関連性があるかどうかを判断する- 関連性がない場合はスキップする
- クライアントはアクタが存在するレベルをロードしたかどうかを判断する
- 上記から接続を所有する関連リストにアクタを追加する
- この時点で接続に関連性のあるアクタのリストを保持する
- プライオリティでアクタを並べ替える
- 並び替えした各アクタに対して:
- 接続先がこのアクタが存在するレベルをロードしていない場合はチャンネルをクローズ、存在する場合は継続する
- 1 秒ごとに AActor::IsNetRelevantFor を呼び出して、アクタと接続の関連性を判断する
- 5 秒間関連しなかった場合は、チャンネルをクローズ
- 関連性がありチャンネルが開いていない場合は、新しいチャンネルを開く
- どこかの時点でこの接続がサチュレートした場合
- 残りのアクタに対して
- 1 秒未満しか関連しなかった場合は、次のティックで強制的に更新
- 2 秒以上関連した場合は、次のティックの更新をするかどうかの判断に
AActor::IsNetRelevantFor
を呼び出す
- 残りのアクタに対して
- 上記すべてをパスするアクタは、
UChannel::ReplicateActor
を呼び出して接続先にアクタをレプリケート
- 上記より考慮する各アクタに対して
アクタを接続先にレプリケートする
UChannel::ReplicateActor
はアクタとそのコンポーネント全てを接続先にレプリケートする重要な役割を果たします。フローは以下のように表示されます:
- このアクタのチャンネルが開いた後、初めての更新かどうかを判断
- 初回更新の場合は、特定の必要な情報をシリアライズする (初回位置、回転など)
- この接続がこのアクタを所有するか判断する
- 所有しない場合は、そしてこのアクタの役割が
ROLE_AutonomousProxy
の場合は、ROLE_SimulatedProxy
に格下げする
- 所有しない場合は、そしてこのアクタの役割が
- このアクタの変更したプロパティをレプリケートする
- 各コンポーネントの変更したプロパティをレプリケートする
- 削除したコンポーネントに対し、特別な delete コマンドを送信する