Iris は、Unreal Engine の既存のレプリケーション システムと連動して機能するオプトイン レプリケーション システムです。このシステムは、サーバー インスタンスごとに最大 100 人のプレイヤーをサポートする フォートナイト バトルロイヤル における Epic の経験をもとに構築されています。Iris は、マルチプレイヤー エクスペリエンスにおける次の要素をサポートしています。
- より大規模でよりインタラクティブなワールド。
- より多いプレイヤー数。
- サーバー負荷の削減。
現在のゲーム コードには最小限の変更を加えるだけで機能するはずです。Iris にオプトインするには、ゲーム コードで新しいエンジン API を使用する必要がありますが、C++ およびブループリントにおける既存の レプリケートされたプロパティ と リモート プロシージャ コール (RPC) の定義については、マイナーな変更のみで互換性を確保できます。このドキュメントでは次のトピックを扱います。
概要
ネットワーク ゲームでは、複数のコンピュータ間でゲーム ステートの変更を伝達するために レプリケーション システム を使用します。Unreal Engine では、従来、次の要素で構成されたサーバークライアント モデルを使用しています。
- ゲームをホストする サーバー。サーバーのゲーム バージョンは 権威 を有していると表され、ゲームのそのインスタンスが真のゲーム インスタンスであることを意味します。
- ゲームに接続するプレイヤー制御の クライアント。
レプリケーション システムでは、クライアントでのゲーム ステートの変更をサーバーに伝達する方法と、サーバーに累積された変更をクライアントに伝達する方法を制御します。Iris では、変更が加えられた際にレプリケーション システムに通知することで、クライアントでほとんどの作業が行われることを想定しています。これにより、Iris では既存のレプリケーション システムのパフォーマンスを向上することができます。
パフォーマンスの向上
Iris では、以下を通じてレプリケーションのパフォーマンスを向上します。
- コンストレイントがあるアンチパターンを除外することで、スケーラビリティを高める。
- レプリケーションとゲーム スレッド データを分離することで、同時並行性を実現する。
- 複数のオブジェクトと接続のワークロードを共有することで、効率を向上する。
設計
クリックしてフルサイズで表示。この図の重要な各用語については、後述の「Iris の主要なコンポーネント」と「重要な概念」の 2 つのセクションで説明されています。
Iris レプリケーション システム は Unreal Engine (UE) における Iris のメイン インターフェースです。Iris の主な目的は、ゲームプレイ システムとレプリケーション システムとの間の依存関係を最小限に抑えることにあります。Iris ではこのために、レプリケートされたすべてのステート データのコピーを量子化された形式で維持します。これによって負荷が大きい多くの処理が最小限に抑えられて、接続間での処理の共有が可能になり、同時並行でより多くの処理を行いやすくなります。
Iris の主要コンポーネント
レプリケーション システム
レプリケーション システムは Iris の内部システムのインターフェース レイヤーであり、必要な API 機能のみを公開します。レプリケーション システムでは次の作業を実行します。
- ゲームのすべてのネットワーク ステート データのコピーを維持する。
- レプリケートされたアクタのステートを接続ごとにトラックする。
- どのアクタがどの接続にレプリケートされるかをフィルタリングする。
- レプリケーションの優先順位を決める。
- 転送に向けてデータをシリアル化する。
レプリケーション システムのコンポーネント
次の表は、レプリケーション システムの主要なコンポーネントを示しています。
コンポーネント | 説明 |
---|---|
Replication States (レプリケーション ステート) | レプリケートする必要があるデータを含む構造体。レプリケーション システムでは、ゲームのすべてのネットワーク ステート データのコピーが維持されます。 |
Prioritization (優先順位) | アクタとオブジェクトのレプリケーションの優先順位を設定します。 |
Filtering (フィルタリング) | どのアクタがどの接続にレプリケート可能かをフィルタリングします。 |
Net Serializers (ネット シリアライザ) | ネットワークを介した転送に向けてデータをシリアル化します。 |
Data Streams (データ ストリーム) | ネットワーク接続を介してデータのレプリケーションを実装するインターフェースです。 |
レプリケーション ブリッジ
レプリケーション ブリッジ では、ゲームプレイ コードとレプリケーション システムとの間のコミュニケーションを制御します。レプリケーション ブリッジでは次の処理が行われます。
- アクタまたはオブジェクトのレプリケーションを開始/停止する。
- レプリケートされたデータの記述子とプロトコルをビルドする。
- アクタまたはオブジェクトをレプリケーション システムに追加/削除する。
重要な概念
ネット オブジェクト
レプリケートされたアクタとオブジェクトは、Iris の内部ではネット オブジェクトとして表されます。ネット オブジェクト は次の要素で構成されています。
- レプリケーション プロトコル。
- レプリケーション インスタンス プロトコル。
- 量子化されたデータを格納するバッファ。
Replication State
Replication State では、レプリケーション システムとゲームプレイ コードとの間でステート データを伝達します。レプリケーション ステートの形式は非常に基本的なもので、レプリケートされるデータを含む構造体です。レプリケーション ステートは明示的に構築するか、既存のプロパティ ベースのリフレクション データから構築された抽象化表現にすることができます。
レプリケーション ステート記述子
レプリケーション ステート記述子 では、データのレプリケートに必要なレプリケーション ステートのすべての側面を記述します。これには次が含まれます。
- メモリのレイアウト
- 条件式
- フィルタリング
- 優先順位
- シリアル化
レプリケーションの各ステート タイプにはそれぞれレプリケーション ステート記述子が含まれています。同じタイプのレプリケーション ステートでは、同じレプリケーション ステート記述子を使用します。
レプリケーション プロトコル
レプリケーション プロトコル では、レプリケーション システムの内部処理に必要なレプリケートされたオブジェクトのすべての側面を記述します。これには、レプリケートされたオブジェクトの総合的なステートを構成する、すべてのレプリケーション ステート記述子のリストが含まれます。レプリケーション プロトコルはオブジェクト タイプごとに設定され、同じタイプのすべてのインスタンス間で共有されます。
レプリケーション フラグメント
レプリケーション フラグメント は、ゲームプレイ コードとレプリケーション システム間でのレプリケーション ステートのやり取りを管理する Iris コンポーネントです。
レプリケーション インスタンス プロトコル
レプリケーション インスタンス プロトコル には、データをソース オブジェクトから取得したり、受信したステート データを受信側のターゲット オブジェクトにプッシュしたりする処理などのゲームプレイ コードとのやり取りに必要なデータが含まれています。レプリケーション インスタンス プロトコルは、レプリケーション フラグメントのリストとして表されます。レプリケーション インスタンス プロトコルはインスタンスに固有のものです。
ネット ハンドル
すべての API 関数はネット ハンドル上で動作します。ネット ハンドル は、レプリケートされたアクタまたはオブジェクトを、レプリケーション システムで使用される内部のネット オブジェクト表現に関連付けるために使用されるユニークな識別子です。ネット ハンドルはレプリケーション システムによって生成され、アクタで BeginReplication
が呼び出された際に返されます。
Iris の運用フロー
このセクションでは、レプリケーションのためのオブジェクト登録から始めて、新たに受信したステート データを受信側で適用するに至るまでの Iris の運用フローについて説明します。
登録
Iris によるレプリケーションのためのオブジェクト登録には、ゲーム コードと Iris の両方でいくつかの操作を行う必要があります。
ゲーム コード
- オブジェクトをレプリケーション システムに登録します。
- ヘッダ プロパティを介して、レプリケーション ステートとレプリケーション ステート記述子を明示的または暗黙的に宣言します。
Iris
- オブジェクトとそのコンポーネントによって定義されたすべてのレプリケーション ステートを使って、レプリケーション プロトコルとレプリケーション インスタンス プロトコルを構築します。
- 上記のレプリケーション プロトコルとレプリケーション インスタンス プロトコルを使って、新しく登録されたオブジェクトに対応するネット オブジェクトを作成します。
- レプリケートされたオブジェクトに一意のネット ハンドラを割り当てて、Iris の API 関数でこのレプリケートされたオブジェクトとやり取りできるようにします。
送信者
送信側には次の 2 つのステージがあります。
プリセンド更新
プリセンド更新は、データを受信側に送信する準備として Iris で処理される複数のステップで構成されています。プリセンド更新では Iris によって以下が行われます。
- レガシー モードで実行している場合に、レプリケートされたすべてのオブジェクトをステート変更のためにポーリングする。
- すべてのダーティ ステート データを適切なネット シリアライザで量子化する。
- すべてのネット オブジェクトのフィルタリング ステータスと優先順位を更新する。
センド更新
センド更新は、すべての Iris データ ストリームをティックすることによるパケットの作成とデータ入力で構成されています。
ネット トークン データ ストリーム
ネット トークン データ ストリームでは、適切なネット シリアライザであらゆる新しいトークンをシリアル化します。
レプリケーション データ ストリーム
レプリケーション データ ストリームから読み取ったデータについては、Iris によって以下が行われます。
- ダーティ ステートのオブジェクトを、オブジェクトとスケジュールの優先順位に基づいて送信するようにスケジュール設定する。
- オブジェクトを優先順位と依存関係に基づいて並び替える。
- 適切なネット シリアライザであらゆる新しいデータをシリアル化する。
Iris では、この段階でデータを適切な接続に送信します。
受信側
受信側でパケットの受信が開始すると同時に、受信側は受信したパケットに関する通知を送信側に送ります。それぞれのパケットを受信するたびに、適切なデータ ストリームによってパケットに含まれるデータが処理されます。
ネット トークン データ ストリーム
ネット トークン データ ストリームによってサーバーとクライアント間のオブジェクト パスが同期されるので、それらをより小さな表現を使ってレプリケートできるようになります。
レプリケーション データ ストリーム
レプリケーション データ ストリームから読み取ったデータについては、Iris によって以下が行われます。
- 受信したステート データをデシリアライズ化して読み取る。
- 新しいオブジェクトを即座にインスタンス化する (これらのオブジェクトはレプリケーション プロトコルの構築に必要になるため)。
- データをゲームにプッシュして、レプリケートされた適切なオブジェクトに新しいステートを適用し、ゲームプレイに反映させられるようにする。
プロジェクトで Iris を使用する
Unreal Engine ではデフォルトで Iris を使ってコンパイルしますが、デフォルトのレプリケーション システムとしては、既存のレプリケーション システムが依然として使用されます。Iris をプロジェクトで使用できるようにするには、.uproject
ファイルの Plugins
セクションに次のコード ブロックを追加して、Iris プラグインを有効にしておきます。
{
"Name": "Iris",
"Enabled": true
},
SetupIrisSupport
を呼び出して、Iris に必要な依存関係を迅速かつ簡単にモジュールの「.Build.cs
」ファイルに追加します。次のコードをモジュールの「.Build.cs
」ファイルに追加して、Iris をモジュールに含めます。
SetupIrisSupport(Target);
ランタイム時に Iris を有効/無効にする
Iris は、次のコマンドライン引数を使ってランタイム時に有効/無効にすることができます。
-UseIrisReplication=1
:Iris を有効にする-UseIrisReplication=0
:Iris を無効にする
IrisNetDriverConfigs
エントリで Iris が有効になっているネット ドライバーでは、レプリケーションに Iris を使用します。
Iris を使った Unreal Engine のコンパイルを無効にする
Iris を使った Unreal Engine のコンパイルを完全に無効にしたい場合は、「.Build.cs
」ファイル内で bUseIris = false
に設定します。