【UE5】Generate Overlap Eventsの罠

プログラマーの尾関です。

今回は知らないところで処理負荷を発生させる “Generate Overlap Events” の罠について紹介したいと思います。

  • 動作確認バージョン:UE 5.6.1

結論

結論を先に書いておくと、Generate Overlap Events は Overlap(重なり)イベントを有効化する設定です。

特に「Static Mesh Component」「Widget (3Dウィジェット)」では、初期状態でGenerate Overlap EventsがONとなっており、いつのまにか処理負荷を増大させることがあります。

Overlap を使わない、例えば飾り用の Static Mesh などでこのフラグが ON になっていると、移動や更新のたびに Overlap の更新コストが発生し、負荷の原因になることがあります。
またゲームで使う3Dウィジェットは、基本的に体力ゲージなどを表示するだけで Overlap は不要なのですが、初期状態では ON (衝突有効) になっているというハマりポイントがあります。
そういった場合、不要であればGenerate Overlap Events を OFF(あるいは専用の小さな Collision コンポーネントだけで ON)にすることで処理コストを減らすことができます。

パフォーマンスの検証

では実際に Generate Overlap Events によってどのような負荷が発生するのかを検証してみます。

以下のような3D Widgetをつけたオブジェクトを1000個Spawnしてみます。

このオブジェクトは “StaticMesh” と “Widget” (3Dウィジェット) を持っています。

そして “StaticMesh” と “Widget” それぞれの Generate Overlap Events が ON の状態です。

実行してみると以下の結果となりました。UpdateOverlaps Timeが「12.59ms」、PerformOverlapQuery Timeが「11.88ms」となっています。

トータルの負荷である World Tick Timeは「42.99ms」となっています。(※コンソールコマンドの「stat game」コマンドで確認)

Overlap Eventにより負荷の発生タイミング

Overlap Eventは対象のオブジェクトが「動いた」場合のみ処理されます。

今回はそれを含めた検証をするために “Set Timer by Event” で Static Meshを少しだけ動かす処理を入れてみました。

次にGenerate Overlap Events が OFF の状態で実験してみます。

するとUpdateOverlaps Time, PerformOverlapQuery Timeのコストが0になりました。

トータルの「World Tick Time」も「21.21ms」なので、おおよそ Overlap Event関連の処理負荷が削減できています。

おしまい

以上、“Generate Overlap Events” の罠についてでした。

なおこの問題は特定のプラットフォーム(モバイルなどパフォーマンスがあまり出ない環境)にて起こりやすいようです。

ややニッチな問題でしたが、何かのお役に立てれば何よりです。

おまけ:PerformOverlapQuery TimeとUpdateOverlaps Timeの違いについて

PerformOverlapQueryとは Overlap Eventの対象を「探す」処理となります。そして対象が見つかった場合にUpdateOverlapsによって Overlap Eventの「リストを更新」する処理となります。

Overlap処理の種類概要処理内容
PerformOverlapQuery重なっている相手を探す物理シーンへの問い合わせやAABB、形状同士の判定など
UpdateOverlaps見つけた相手を整理して通知前フレームとの差分計算、リスト更新、Begin/EndOverlapのディスパッチ

\ 最新情報をチェック /