Iris レプリケーション システム は Unreal Engine (UE) における Iris のメイン インターフェースです。Iris は、レプリケートされたすべてのステート データの完全なコピーを量子化された形式で保持することにより、ゲームプレイ システムとレプリケーション システムとの間の依存関係を最小限に抑えます。Iris では負荷が大きい処理は 1 回のみ実行され、接続間の処理が共有されます。これによって、より多くの処理を同時に行うことができるようになります。同時作業を行うと、時間とリソースの節約になります。
このページでは次の項目について説明します。
- レプリケーション ブリッジとレプリケーション システムにアクセスするための手順
- Iris がオブジェクトをレプリケートする内部処理の概要
インターフェース
Iris レプリケーション システム インターフェースを使用すると、レプリケーション システム自体の管理や、コントロールへの機能の提供を行うことができます。
- 接続
- グループ
- 優先順位付け
- フィルタリング
- リモート プロシージャ コール
すべての Iris インターフェース機能は、レプリケーション ブリッジで作成されたネット参照ハンドル (FNetRefHandle
) で動作します。ネット参照ハンドル は、Iris レプリケーション ブリッジで作成された識別子です。ネット参照ハンドルは、ネットワーク オブジェクトを、作成時に指定された関連するゲームプレイ インスタンス (UObject
、UActorComponent
、または AActor
) に一意にマップするキーです。
Iris の説明に使用する用語の詳細については、「Iris 用語集」ドキュメント ページを参照してください。
レプリケーション ブリッジ
Iris レプリケーション ブリッジは、アクタなど、ゲームプレイ インスタンス オブジェクトで動作するすべての機能を実行します。レプリケーション ブリッジ は、ゲーム コードと内部 Iris レプリケーション システム間に存在します。ブリッジは Iris のすべての処理の中央チャンネルで、Iris レプリケーション システムとゲームプレイ コード間のステート データの通信を行います。
送信マシンで、レプリケーション ブリッジはネットワーク オブジェクトの存続期間とレプリケーション システムで必要なプロトコルを管理します。レプリケーション ブリッジを使用して、レプリケートされたオブジェクトのネット参照ハンドルを取得できます。次に、ネット参照ハンドルをレプリケーション システムで使用して、オブジェクト用にレプリケーション設定をカスタマイズします。
受信マシンで、レプリケーション ブリッジは、アクタのインスタンス化と存続期間の管理を行います。
具体的に、レプリケーション ブリッジは以下のことを行います。
BeginReplication
とEndReplication
で、レプリケートされたオブジェクトのレプリケーションを開始および終了する。- レプリケーション プロトコルとレプリケーション インスタンス プロトコルの作成を制御する。
- オブジェクトのインスタンス化に必要なデータをシリアル化およびシリアル化解除する。
- レプリケーション システムのゲーム側でオブジェクトをインスタンス化する。
- ゲームプレイ インスタンスとネット参照ハンドル間のマッピングを処理する。
レプリケーション ブリッジの関連ヘッダ ファイルには、以下のものが含まれています。
..\Engine\Source\Runtime\Engine\Public\Net\Iris\ReplicationSystem\ActorReplicationBridge.h
..\Engine\Source\Runtime\Experimental\Iris\Core\Public\Iris\ReplicationSystem\ObjectReplicationBridge.h
レプリケーションを制御する
オブジェクトをレプリケートするために、Iris では最初にオブジェクトのネットワーク表現を作成します。レプリケーション ブリッジは、BeginReplication
のネット オブジェクトとネット参照ハンドルの作成を管理します。
レプリケーションを開始する
BeginReplication
の実行時に、Iris は、オブジェクトに関連付けられたレプリケートされたデータのすべての側面を記述するレプリケーション プロトコルを設定します。このレプリケーション プロトコルは、同じタイプのすべてのインスタンスで共有されます。オブジェクトのインスタンスごとに、レプリケーション システムでは、インスタンス固有のデータを含むレプリケーション インスタンス プロトコルを作成します。インスタンス固有のデータには、レプリケートする必要があるデータを配置する場所とこの特定のインスタンスに受信したデータをプッシュする場所が含まれています。
レプリケーション ブリッジにアクセスする
Iris がレプリケートされたオブジェクトのネット参照ハンドルを作成すると、レプリケーション システム API を使用して、オブジェクトがレプリケートする方法を制御できます。レプリケートされたオブジェクトのネット参照ハンドルを取得するには、以下の手順に従います。
-
必要な Iris ファイルを含めます。
#if UE_WITH_IRIS #include "Net/Iris/ReplicationSystem/ReplicationSystemUtil.h" #include "Net/Iris/ReplicationSystem/ActorReplicationBridge.h" #endif UE_WITH_IRIS
-
アクタのレプリケーション ブリッジへの参照を取得します。
// ネット参照ハンドルを取得するアクタ AActor* RepActorPtr; UActorReplicationBridge* ReplicationBridge = UE::Net::FReplicationSystemUtil::GetActorReplicationBridge(RepActorPtr);
-
レプリケートされたアクタのネット参照ハンドルを取得します。
UE::Net::FNetRefHandle RepActorNetRefHandle = ReplicationBridge->GetReplicatedRefHandle(RepActorPr); // これで、レプリケーション システムを取得して API 操作を実行できるようになりました。
レプリケーションを終了する
EndReplication
の実行時に、レプリケーション システムは、ゲームプレイ オブジェクト用に作成したすべてのネットワーキング リソースをクリーンアップし、オブジェクトのレプリケーションを停止します。
ステート トラッキング
Iris では、実行する処理が存在する場合にゲームがレプリケーション システムに通知すると、最適に実行します。Iris では、レプリケーション システムが変更をポーリングすることを想定していません。レプリケーション システムでは、レプリケートされたプロパティが変更されるときは常に通知されることを想定しています。この変更システムを効率的に実行するために、Iris のレプリケートされたすべての変数がレプリケーション ステートに含まれています。レプリケーション ステート は、ネットワーク上でレプリケートまたは送信される必要のあるデータを含む構造体です。
レプリケーション ステートには、メンバーのダーティネスをトラッキングするビットフィールドのために割り当てられた領域があります。メンバーのステートが変更された場合、メンバーは ダーティ ですが、変更はまだダウンストリーム システムに伝達されていません。レプリケーション ステートには、更新する必要があるダーティなステート データがオブジェクトに含まれていることをレプリケーション システムに通知するのに使用する埋め込みの識別子も含まれています。
レプリケーション システム
レプリケーション システムは、Iris でレプリケートされたオブジェクトと対話するための主要な API です。レプリケーション ブリッジを介して対話するオブジェクトのネット参照ハンドルを取得すると、オブジェクトのレプリケーション動作をカスタマイズできます。カスタマイズには、オブジェクトのレプリケート先の接続のフィルタリングやオブジェクトのレプリケーション優先順位の更新が含まれています。
レプリケーション システムにアクセスする
レプリケートされたオブジェクトに使用するレプリケーション システムにアクセスするには、以下の手順に従います。
-
必要な Iris ファイルを含めます。
#if UE_WITH_IRIS #include "Net/Iris/ReplicationSystem/ReplicationSystemUtil.h" #endif UE_WITH_IRIS
-
ゲームプレイ コードで、レプリケートされたオブジェクトのレプリケーション システムを取得します。
// ネット参照ハンドルを取得するアクタ AActor* RepActorPtr; UReplicationSystem* ReplicationSystem = UE::Net::FReplicationSystemUtil::GetReplicationSystem(RepActorPtr);
レプリケーション システムの関連ヘッダ ファイルには、以下のものが含まれています。
..\Engine\Source\Runtime\Engine\Public\Net\Iris\ReplicationSystem\ReplicationSystemUtil.h
..\Engine\Source\Runtime\Experimental\Iris\Core\Public\Iris\ReplicationSystem\ReplicationSystem.h
レプリケートされたオブジェクトのレプリケーションをカスタマイズする方法の例については、フィルタリングと優先順位付けのドキュメントを参照してください。
レプリケーション システムのプロセス フロー
このセクションでは、Iris の内部処理のプロセス フローおよび Iris のさまざまなコンポーネントの仕組みについて説明します。
プロセス フローは、1 台の送信マシンと 1 台以上の受信マシンから構成されています。送信マシンには、送信側がマルチプレイヤー セッションで他の接続済みマシンに伝達する必要のある、レプリケートされたオブジェクトの新しい情報が含まれています。送信マシンのレプリケーション プロセスは、プリセンド更新とセンド更新の 2 つのステップから構成されます。古い情報が含まれている接続済みマシンは、送信マシンのステートと一致するレプリケートされたオブジェクトに関する情報を更新する必要がある受信マシンです。
ネット シリアライザとデータ ストリームは、送信マシンと受信マシン間のデータ通信の処理時に使用されます。ネット シリアライザは、ネットワークを介して効率的に転送できるようにデータをトランスフォームします。データ ストリームは、特別なデリバリ保証を含め、データの送信方法を定義します。
送信マシン
プリセンド更新
レプリケーション システムの送信側のプリセンド更新は、多くの共有作業が実行される場所です。これは、システムがゲームプレイ コードのデータにアクセスする唯一の時間でもあります。この更新は、次の手順で構成されています。
- レガシー モードで実行している場合、レプリケートされたオブジェクトをステート変更のためにポーリングします。
- すべてのダーティなステート データをコピーおよび量子化します。
- レプリケートされたオブジェクトのダーティネス ステータスをリセットします。
- ネット オブジェクトのフィルタリング ステータスを更新します。
- ネット オブジェクトの優先順位付けを更新します。
センド更新
パケット データを入力した場合、目的はレプリケーション システム内に含まれていないデータに触れないことです。これによって、キャッシュフレンドリーな方法でタスクを同時に実行することが容易になります。センド更新プロセスはすべての接続に対して、以下のように続行します。
- すべてのデータ ストリームをティックして、パケットの作成とデータ入力を行います。
- レプリケーション データ ストリーム:
- ダーティ ステートのオブジェクトを、オブジェクトの優先順位とスケジュールの優先順位に基づいて送信するようにスケジュール設定します。
- 優先順位と依存関係に基づいて並び替えます。
- ステート データをシリアル化します。
- レプリケーション データ ストリーム:
受信マシン
パケットを受信する側は、すべての接続に対して、以下のように受信パケットを処理します。
- 最初にデリバリ通知を更新します。
- データ ストリームは、各パケットに含まれているデータを処理します。
- レプリケーション データ ストリーム:
- ステート データの読み取り: ステート データはパケット全体が読み取られた後、ディスパッチされます。レプリケーション システムがこれらに依存してレプリケーション プロトコルを構築するため、新しいオブジェクトは即座にインスタンス化されます。
- ステート データのディスパッチ: レプリケーション システムは新しいデータをゲームにプッシュして、ゲームプレイ オブジェクトを更新します。
- レプリケーション データ ストリーム:
詳細情報
アクタのレプリケーション動作の変更方法の例など、Iris レプリケーション システムのコンポーネントの詳細については、このセクションの他のドキュメント ページを参照してください。