こんにちは!情熱開発部プログラム課の平野です!
今回はUE4歴1年の私が、レプリケーションの最適化に関連する機能について調べてみようと思います。と申しますのも、最近業務でこのあたりの機能に触れる機会があったのですが、仕様を理解していないが故に謎のバグに悩まされるということがあり…
技術ブログを担当させていただけるこの機会に乗じて、私自身の勉強も兼ねてしまおうという腹積もりです(小声) 拙い記事になってしまうかもしれませんが、どうか温かい目で見守っていただければと思います。
そもそもレプリケーションとは?
レプリケーション対象(AActor::bReplicatesがtrue)のアクターがサーバー上でパラメータ更新された際に、自動的にクライアントへ同期してくれる機能です。
通信帯域が足りている時は即時レプリケーションされますが、足りなくなってしまうと同期が遅れていきます。(UE4内で優先度を計算し、優先度の高いものから順次レプリケーションされます。)
↑の状態になるとサーバーとクライアントのズレによる不具合や、ラグいプレイ感を生み出してしまう原因になり得ます。
レプリケーション最適化機能
NetPriority
AActor::NetPriorityはレプリケーションによるパラメータ更新の優先度を設定することができます。UE4は通信帯域が飽和状態にある場合、
(「前回同期してからの時間」+ 「向きや距離」) *「NetPriority」で優先度を決め、順次同期処理を行います。
つまり重要度の高いアクターはこの値を高めに設定しておくことで、帯域が飽和状態にあっても(優先度の低いアクターの更新を犠牲に)同期されやすい状態にすることができます。
// NetPriorityが1のアクターと比べて2倍同期されやすくなります
NetPriority = 2.0f;
NetRelevancy
NetRelevancyは主に距離情報を考慮し、そのアクターが レプリケーションされるべきかの判定をする仕組みです。
AActor::NetCullDistanceSquaredで指定した距離内のアクターが レプリケーションされます。(指定した距離外のアクターは距離カリングされます。)
また、 AActor::bAlwaysRelevantを有効にすることで、どんな距離でも必ず レプリケーションされるように設定可能です。
// 10mの距離内にいる観測者からのみレプリケーションされます(距離の2乗)
NetCullDistanceSquared = 1000000.0f;
// どんな距離でも必ずレプリケーションされます
bAlwaysRelevant = true;
NetUpdateFrequency
AActor::NetUpdateFrequencyはレプリケーションの更新頻度設定ができます。
重要度の低いアクターや頻繁に同期しなくてもよいアクターは、この数値を低めに設定することで、他の重要度の高いアクターが効率的に通信帯域を使用することができます。
// 毎秒10回の頻度で同期されます
NetUpdateFrequency = 10.0f;
NetDormancy
AActor::NetDormancyはアクターを休眠状態(同期しない状態)に指定することができます。
長時間、値が変更されないということが分かっている場合や、値を同期する必要がなくなったアクターに対して休眠状態を指定することで、値が変更されたかどうかの検査コストを下げることができます。
//-------------------------------------------------
// サーバー上のAActor::SetNetDormancy()で設定します
//-------------------------------------------------
// 休眠状態の場合復帰、その後指定されるまで休眠状態にはなりません
SetNetDormancy(DORM_Never);
SetNetDormancy(DORM_Awake);
// 休眠できる状態になると休眠状態に移行します
SetNetDormancy(DORM_DormantAll);
// 一部の接続で休眠挙動を変更したい場合に使用します(別途実装必須)
SetNetDormancy(DORM_DormantPartial);
// 同期リストから排除され休眠状態に入ります
SetNetDormancy(DORM_Initial);
さいごに
以上、UE4のレプリケーション最適化機能についてでした。
やはり人は何かを犠牲にしなければ、何かを得ることはできないのですね。
ともあれ適切にこれらの機能を活用し、効率的に通信帯域を使って、ラグや不具合のないネットワークゲームを制作していきたいですね。(ラグいゲームはそれだけで嫌われてしまうので…
最後までご清覧いただきありがとうございました!
参考にさせていただいた資料等
https://docs.unrealengine.com/ja/InteractiveExperiences/Networking/Actors/Properties/index.html
【免責事項】
本サイトでの情報を利用することによる損害等に対し、
株式会社ロジカルビートは一切の責任を負いません。