Unreal Engine (UE) では、UObject メモリの管理にマークアンドスイープ ガベージ コレクターを使用しています。ソフトリアルタイム アプリケーションでは、従来ガベージ コレクターに大きな欠点が 1 つありました。ガベージ コレクターが解放可能なオブジェクトのメモリを特定する間に、ゲームプレイにヒッチが生じる可能性があるという点です。UE では、このプロセスを「到達可能性解析」と呼んでいます。UE は常に、ガベージ コレクションのこのフェーズが 1 フレーム内で完了することに依存しています。そのため、すべての UObject 処理、特にゲームプレイが一時的に停止します。到達可能性解析でスキャンする必要のあるオブジェクトが多いほど、一時停止時間が長くなります。そのため、通常は、ゲームプレイで認識できるほどのヒッチが発生することはあまりありません。プログラマーは、次の複数の方法でこの問題を回避することができます。
- UObject のバジェットを厳しく抑える
- UObject プールを使用する
- 通常のゲームプレイ中にガベージ コレクションを無効にする
ただし、これらの回避策は、コードの複雑さとプロジェクト全体のコストを増加させる傾向があります。
インクリメンタル到達可能性解析
UE では、「インクリメンタル到達可能性解析」を使用することで、これを改善します。ユーザーは、ガベージ コレクターの到達可能性分析フェーズを、設定可能なフレームごとのソフト時間制限で、複数のフレームにわたって分割できるようになりました。エンジンは、到達可能性のイテレーションの間に、TObjectPtr プロパティを介して UObject の参照を追跡します。つまり、ガベージ コレクションが進行している間に、TObjectPtr で公開された UPROPERTY への割り当てにより、オブジェクトを到達可能として即座にマークします。これはガベージ コレクターの「ライト バリア」としても知られています。
エンジンは、UObject や FGCObject AddReferencedObjects 関数を含む、ガベージ コレクターに UObject を公開する場所で、生の C++ ポインタではなく、TObjectPtr を使用するようにすでに変換されています。Unreal Engine を使用してビルドされたプロジェクトでインクリメンタル到達可能性解析を使用するには、すべての UPROPERTY インスタンスを、生の C++ ではなく TObjectPtr を使用するように変換することが重要です。これを行わない場合、ガベージ コレクションが UObjects のメモリの一部を早く解放しすぎることがあります。この機能は、まずは、実験的機能としてリリースされます。到達可能性解析フェーズが指定された制限時間を超える可能性があるためです。
インクリメンタル到達可能性解析を有効にする
インクリメンタル到達可能性解析は、プロジェクトの DefaultEngine.ini に以下のコンソール変数を追加することで、有効にすることができます。
[ConsoleVariables]
gc.AllowIncrementalReachability=1 ; enables Incremental Reachability Analysis
gc.AllowIncrementalGather=1 ; enables Incremental Gather Unreachable Objects
gc.IncrementalReachabilityTimeLimit=0.002 ; sets the soft time limit to 2ms
追加のコンソール変数
また、ストレステストとデバッグの目的で、一連の追加のコンソール変数も提供しています。
| コンソール変数 | 説明 | 型 |
|---|---|---|
gc.DelayReachabilityIteration |
指定したフレーム数だけ到達性解析を遅延させます。GC バリアのストレス テストに使用します。 | <INTEGER>:フレーム数 (デフォルト:10) |
gc.VerifyNoUnreachableObjects |
到達可能な (有効な) オブジェクトが到達不可能な (すぐに破壊される) オブジェクトを参照していないことを確認するために、到達可能性解析が完了した後にテストを実行します。 | 0:無効、1:有効 |
gc.ContinuousIncrementalGC |
前のガベージ コレクションが完了した後、インクリメンタル ガベージ コレクションを再開し続けます。 | 0:無効、1:有効 |
パフォーマンス比較
以下は、インクリメンタル到達可能性をオフにしたサンプル プロジェクトのパフォーマンス グラフを Unreal Insights で可視化したものです。青の線は総フレーム時間を表し、オレンジの線は到達可能性解析にかかった時間を表しています。Unreal Insights は、複数のフレームで区切られた単一イベント間の連続グラフ線をプロットします。ガベージ コレクションがタイムライン全体を通して実行されているように見えても、実際には一度に 1 フレームしか実行されません。
以下のグラフ比較の最初の画像では、ガベージ コレクションが実行されるたびにスパイクが発生するのが明確にわかります (タイムラインの上部にある「GC」ラベルで示されます)。


2 番目の画像では、インクリメンタル到達可能性がオンになっているため、GC のラグ スパイクがなくなり、インクリメンタル到達可能性が複数のフレームにまたがって分割されていることがわかります (幅が広くなった薄緑のバーで表されています)。