Unreal Engine では、ネットワーク更新時にすべてのアクタがレプリケートすることが保証されません。これは、ネットワーク リソースが制限されていることによるものです。主な制限の要因は接続の帯域幅です。接続の 帯域幅 は、接続の最大データ転送量です。接続がその量を超えると、接続は 飽和します。接続が飽和すると、Unreal Engine のレプリケーション システムではロードバランス技術を使用し、すべてのアクタに 優先度 の数値を割り当てます。この優先度により、アクタのゲームプレイにおける重要度に基づいて、各アクタはネットワーク帯域幅の使用可能なリソースを公正に取得できます。相対的な優先度が高いアクタがレプリケートに重要なアクタになるので、そのアクタはレプリケーションにより多くの帯域幅を得ます。
アクタの優先度を取得する
各アクタには、浮動小数点 AActor::NetPriority
プロパティがあります。高い NetPriority
は、他のアクタよりも多くの帯域幅に対応します。たとえば、NetPriority == 2.0
のアクタは NetPriority == 1.0
のアクタよりも多くのリソースを使用できます。優先度は比率が重要です。すべてのアクタのネット優先度を変更しても Unreal Engine のネットワーク パフォーマンスを改善することはできません。
ベースラインとして、一般的な Unreal Engine クラスで使用される初期値を次に示します。
クラス | 優先度 |
---|---|
AActor |
1.0 |
APawn |
3.0 |
APlayerController |
3.0 |
NetPriority
は、低い帯域幅または飽和した接続に使用されます。AActor::GetNetPriority
は、ベース NetPriority
、ビューアへの距離、最後にレプリケートしてからの時間などの要素に基づいてアクタの現在の優先度を決定します。
アクタの優先度を受け取る
ネットワーク ドライバでは、GetNetPriority
を呼び出して、特定の接続に対するレプリケーションにアクタの現在の優先度を決定します。これは、ネットワーク ドライバによって自動的に処理されます。
アクタの関連性をオーバーライドする
AActor
派生クラスの仮想関数 GetNetPriority
をオーバーライドし、NetPriority
でベース ネットワーク優先度を変更して、アクタの優先度をカスタマイズできます。
アクタの GetNetPriority
をオーバーライドするときは注意が必要です。Unreal Engine のレプリケーション システムに慣れていないと、意図しない結果に至る場合があります。
優先度の決定方法
アクタの現在のネットワーク優先度は、浮動小数点の優先度を取得するために、最後にアクタがレプリケートされてからの時間やさまざまな追加の要素に基づいて計算されます。
パラメータ
アクタのネットワーク優先度は次の入力パラメータに基づいています。
パラメータ | 説明 |
---|---|
ViewPos |
ビューアの位置。 |
ViewDir |
ビューアーが向いている方向。 |
Viewer |
ネットワーク優先度が決定されるクライアントによって所有されるネットワーク オブジェクト。通常、これはプレイヤー コントローラーです。 |
ViewTarget |
Viewer によって、現在表示または制御されているアクタ。通常、これはポーンです。 |
InChannel |
このアクタがレプリケートされているチャンネル。 |
Time |
このアクタが最後にレプリケートされてからの時間。 |
bLowBandwidth |
ビューアの帯域幅が低い場合、true。 |
優先度のロジック
ほとんどの AActor::GetNetPriority
は、ビューアからの距離やビューアへの視線、および現在のアクタが最後にレプリケートしてからの時間に基づいて、定数 AActor::NetPriority
の倍数因子を計算するために実行します。
ネットワーク優先度は、次のように決定します。
- 次の条件の両方が有効な場合、現在のアクタは所有者のネットワーク優先度を使用します。
- 現在のアクタに所有者がある。
- 現在のアクタがその所有者のネットワーク関連性を使用するように設定されている。
- 次の条件の少なくとも 1 つが有効な場合、現在のアクタのネットワーク優先度が高くなります。
- 現在のアクタは現在の接続のポーンである。
- 現在の接続のポーンは一部のアクションのインスティゲーターである。
- 前述の 2 点のいずれも当てはまらない場合、計算に基づいた距離が現在のアクタのネットワーク優先度を決定するために実行されます。
- 現在のアクタがビューアの前にいる場合、優先度は設定された距離に反比例します。
- 現在のアクタとビューア間の距離が
CLOSEPROXIMITY
よりも大きく、NEARSIGHTTHRESHOLD
より小さい場合、優先度は0.2
で乗算されます。 - 現在のアクタとビューア間の距離が
NEARSIGHTTHRESHOLD
よりも大きい場合、優先度は0.4
で乗算されます。
- 現在のアクタとビューア間の距離が
- 現在のアクタとビューア間の距離が
FARSIGHTTHRESHOLD
よりも大きく、ビューアが現在のアクタを見ている場合、優先度は2.0
で乗算されます。 - 現在のアクタとビューア間の距離が
MEDSIGHTTHRESHOLD
よりも大きい場合、優先度は0.4
で乗算されます。
- 現在のアクタがビューアの前にいる場合、優先度は設定された距離に反比例します。
距離と視界のしきい値の定数には、次の値があります。
定数 | 値 |
---|---|
CLOSEPROXIMITY |
500 |
NEARSIGHTTHRESHOLD |
2000 |
MEDSIGHTTHRESHOLD |
3162 |
FARSIGHTTHRESHOLD |
8000 |
これらの定数の定義は、「NetworkingDistanceConstants.h
」にあります。
優先度のリファレンス
関数
名前 | 説明 |
---|---|
GetNetPriority |
レプリケートするアクタを決定する際に、アクタの優先度を決めるために使用します。 |
GetReplayPriority |
GetNetPriority と同様です。リプレイの記録時にアクタの優先度を決めるために使用します。 |
プロパティ
名前 | 説明 |
---|---|
bNetUseOwnerRelevancy |
このアクタに有効な所有者があると、所有者の IsNetRelevantFor と GetNetPriority が呼び出されます。 |
NetPriority |
低い帯域幅または飽和状態でレプリケーションの確認を行う時のこのアクタの優先度。優先度が高いほど、よりレプリケートされます。 |