Choose your operating system:
Windows
macOS
Linux
Relevancy (関連性)
レベルは非常に大きくもできますが、プレイヤーはそのレベルの中でアクタのほんの一部しか見ることができません。レベル内の他のアクタのほとんどは非表示で、聞き取ることもできなければ プレイヤーに対する重要なエフェクトがありません。サーバーが表示可能、またはクライアントに影響を及ぼすと判断するアクタ群は、そのクライアントに関連するアクタ群と判断されます。アンリアル ネットワーク コードでは、 そのクライアントの関連群のアクタについてサーバーがクライアントだけに指示することが、大幅な帯域幅の最適化になります。
アンリアルでは次のルール (順番に) を適用して、プレイヤーのために関連するアクタ群を決定します。これらのテストは、仮想関数 AActor::IsNetRelevantFor()
に実装されています。
アクタが bAlwaysRelevant で、ポーンもしくはプレイヤー コントローラーに所有されている、ポーンである、あるいはポーンがノイズやダメージなどのアクションの扇動者の場合、関連性がある。
アクタが bNetUseOwnerRelevancy でオーナーを所有している場合、オーナーの関連性を使用する。
アクタが bOnlyRelevantToOwner で、初回チェックをパスしない場合、それは関連性がない。
1 つのアクタがもう 1 つのアクタのスケルトンにアタッチされている場合、その関連性は元となる関連性によって決定される。
アクタが非表示 (bHidden == true) で、ルート コンポーネントが衝突しない場合、アクタは関連性をもたない。
ルート コンポーネントがない場合、
AActor::IsNetRelevantFor()
は警告のログを取り、アクタを bAlwaysRelevant=true に設定すべきか確認をしてくる。
AGameNetworkManager が距離に基いた関連性を使用するように設定されている場合、正味のカリング距離より近ければアクタは関連性を持つ。
ポーンとプレイヤー コントローラーは AActor::IsNetRelevantFor()
をオーバーライドし、結果として関連性に対して異なる条件を持つ。
BStatic Actors (クライアント側のままです) もレプリケート可能であることに注目してください。
これらのルールは、プレイヤーに影響を及ぼすことができるアクタ群の近似値を求めるように設計されています。もちろん、完全ではありません。距離をチェックするとアクタが大きいと検出漏れを起こす可能性があります (防止のためにヒューリスティックを使ってはいますが)。環境音のサウンド オクルージョンなどは考慮されていません。ただし、インターネットとしてのレイテンシーとパケットロスの特性によって起こるネットワーク環境によるエラーにそのエラーが圧倒されてしまう数字です。
優先付け
アンリアルは、すべてのアクタの優先順位を付けるロード バランス技術を使い、ゲームプレイに対する重要性を元に、それぞれのアクタに帯域幅を正当に割りあてます。
それぞれのアクタには、 NetPriority と呼ばれる浮動小数点変数があります。数値が高いほど、帯域幅を他のアクタより多く受け取ります。優先度が 2.0 のアクタは、優先度が 1.0 のアクタの ちょうど 2 倍の頻度で更新されます。優先度には比率だけが重要なので、優先度をすべて上げることでアンリアルのネットワーク パフォーマンスを改善することは もちろんできません。パフォーマンスの微調整のために割り当てた NetPriority 値をいくつか紹介します。
Actor = 1.0
Matinee = 2.7
Pawn = 3.0
PlayerController = 3.0
アクタの現在の優先度は、仮想関数 AActor::GetNetPriority() を使って計算されます。スタベーションが起きないように、 AActor::GetNetPriority()
はアクタの直近のレプリケーションから経過した時間を
NetPriority に乗じます。GetNetPriority
関数も、アクタとビューアー間の相対位置と距離を考慮します。