【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」コマンドで確認)

次に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のディスパッチ |


