リアルタイム パフォーマンスのバジェットを維持する必要があるプロジェクトで重要なのは、目標フレーム レートを達成できるフレーム バジェットを設定することです。 通常、これは 30 または 60 フレーム/秒 (FPS) です。 コンテンツやワークフローを調整することで、さまざまなケースでプロジェクトのパフォーマンスを最適化し、向上させることができます。
このガイドでは、Unreal Engine のレイ トレーシング機能を最適化するための出発点と、シーンのデバッグや問題の調査を通じて問題箇所を正確に特定する方法について説明します。
レイ トレーシングの負荷の概要
ハードウェア レイ トレーシングは、2階層の Bounding Volume Hierarchy (バウンディング ボリューム階層) (BVH) を使用してレイ トラバーサルを高速化します。 Top Level Acceleration Structure (トップ レベル アクセラレーション構造) (TLAS) には、シーン全体の全てのメッシュ インスタンスが含まれます。 これらのインスタンスによって参照されるメッシュは、Bottom Level Acceleration Structures (ボトム レベル アクセラレーション構造) (BLAS) です。
下の図は、BVH がレイ トラバーサルでどのように機能するかを視覚的に表現しています。
レイ トレーシングに伴う処理は、主に次の 3 つに分類されます。
スキン メッシュ、ヘアなど、動的に変形するメッシュのためのボトム レベル アクセラレーション構造をビルドする。
シーンおよびシェーダー バインディング テーブル (SBT) 用のトップ レベル アクセラレーション構造をビルドする。
レイ トレーシングを使用する各機能のためのレイ トラバーサルを実行する。
プロジェクトの開発では、コンソール変数を使用して、特定のタイプのジオメトリのレイ トレーシングに伴う負荷をテストすることができます。 これは、レイ トレーシング機能で、そういった負荷を測定したり、完全に無効にしたりするうえで役立ちます。 これらは r.RayTracing.Geometry.* にリストされています。
| ジオメトリタイプ | コンソール変数 | デフォルトの状態 |
|---|---|---|
スタティックメッシュ |
| 有効化済み |
スケルタルメッシュ |
| 有効化済み |
インスタンス化されたスタティックメッシュ |
| 有効化済み |
ランドスケープ テレイン |
| 有効化済み |
ジオメトリキャッシュ |
| 有効化済み |
ジオメトリコレクション |
| 無効 |
Niagara メッシュ |
| 有効化済み |
Niagara リボン |
| 有効化済み |
Niagara スプライト |
| 有効化済み |
プロシージャル メッシュ |
| 有効化済み |
ボトム レベル アクセラレーション構造の更新
スタティックメッシュの BLAS はロード時 (コンソールではクック時) に 1 度だけビルドされますが、動的に変形するメッシュはフレームごとに再ビルドする必要があり、これには大きな負荷がかかります。 BLAS の再ビルドは GPU の演算処理であり、通常、変形される三角ポリゴンの総数に比例します。 多数の三角形のあるスケルタル メッシュを多用すると、GPU の負荷が急増します。
BLAS の再ビルドにかかる負荷は、GPU プロファイラの次の箇所で確認できます。
Scene > CommitRayTracingGeometryUpdates
Scene > CommitHairRayTracingGeometryUpdates
Scene > RayTracingGeometry
以下のジオメトリ タイプではフレームごとに再ビルドが行われます。
GPUSkinCache を使用したスキン メッシュ
ランドスケープ。モーフィングの詳細度 (LOD) を継続的にサポートするために再ビルドされる
Chaos 破壊用の Geometry Collection
ヘア
プロシージャルメッシュ
Niagara パーティクル システム
ハイポリゴン スケルタルメッシュは、BLAS のビルドの負荷が増大する原因として最もよく見られます。 スケルタル メッシュでは、Skeletal Mesh Editor (スケルタル メッシュ エディタ) にある Ray Tracing Min LOD (レイトレーシング最小 LOD) プロパティを使用できます。これにより、レイトレーシング機能で最も高い LOD が使用されなくなります。
D3D12 を使用してプロジェクトを実行しているときに、D3D12.DumpRayTracingGeometries コンソール コマンドを使用すると、ログにダンプされた動的 BLAS 再ビルドの全てのメモリ割り当てのリストを取得できます。 このリストは、プロジェクトを最適化するために使用することができます。
スタティックメッシュ コンポーネントでのワールド位置オフセット
ワールド位置オフセット (WPO) とレイ トレーシング機能の併用を効率的にサポートすることは困難です。なぜなら、BLAS を動的に再ビルドするだけでなく、各インスタンスに対しても固有のメモリが必要になるためです。
デフォルトでは、Unreal Engine はレイ トレーシング シーンのビルド時に WPO を無視するため、自己交差アーティファクトが発生する可能性があります。 スタティック メッシュ コンポーネントは、[Evaluate World Position Offset (ワールド位置オフセットを評価)] 設定で、レイ トレーシングと WPO を使用できるように選択することができます。 ただし、特に指定がない限り、カメラの周りの短距離 (50m) でのみ機能します。
サポートされている WPO のカメラからの距離を有効にして調整するには、以下のように指定します。
r.RayTracing.Geometry.StaticMeshes.WPO 1r.RayTracing.Geometry.StaticMeshes.WPO.CullingRadius 5000.0f
WPO による動的な BLAS のビルドは、GPU プロファイラの [Scene (シーン)] > [RayTracingGeometry] > [RayTracingDynamicGeometryUpdate] の下に表示されます。
インスタンス化されたスタティックメッシュ コンポーネントなどのインスタンス化されたコンポーネントは、デフォルトでは WPO をサポートしません。これは、WPO の負荷がきわめて大きいためです。 [Evaluate World Position Offset (ワールド位置オフセットを評価)] トグルのあるコンポーネントは、デフォルトでは有効になっていません。 このトグルをオンにすると、1 つのメッシュのすべてのインスタンスを個別の BLAS で効果的に変換するため、メモリ負荷が大幅に増大し、レンダリングに時間がかかる可能性があります。
レイ トレーシングのビルド負荷を管理する
このページの前のセクションで説明したとおり、複数の型のメッシュでは動的ジオメトリのビルド パスが使用されますが、これはパフォーマンスに悪影響を与える可能性があります。
レイ トレーシングのメモリ負荷を管理する
参照ベースの常駐
レイ トレーシングにより、必要なメモリが大幅に増加する可能性があります。 レイ トレーシングで表示されるメッシュごとに、レイ トレーシングの最下層アクセラレーション構造を割り当てる必要があります。 一般的に、最下層アクセラレーション構造のメモリ要件は三角形/頂点の数に比例して増加しますが、正確なサイズはプラットフォームによって異なります。 また、表示される全てのメッシュは BLAS を割り当てるため、大量のメモリを消費する可能性があります。
この問題を回避するには、Reference Based Residency (参照ベースの常駐) システムを使用します。このシステムは、TLAS によって直接参照される BLAS のみを割り当てます。 これにより、残りの BLAS のメモリ割り当てを指定することもできます。 参照されていないものや割り当てを超えているものは、全て除外されます。
コンソール コマンド r.RayTracing.UseReferenceBasedResidency を使用することで、参照ベースの常駐システムを有効にできます (デフォルトで有効)。
レイ トレーシング ジオメトリ プールのサイズは、r.RayTracing.ResidentGeometryMemoryPoolSizeInMB を使用して制御できます。これはプラットフォームごとに調整できます。
これはソフト制限であり、LOD のないメッシュは削除されず、永続的に常駐します。 これがレイ トレーシング ジオメトリに適切な LOD 設定であることを保証するには、[Rendering (レンダリング)] > [Generate Ray Tracing Proxies (レイ トレーシング プロキシを生成)] を有効にします。 これにより、あらゆるレイトレーシングの LOD 設定が参照ベースの常駐と適切に連携するようになります。
Naniteフォールバックメッシュを生成
Nanite フォールバック メッシュをレイ トレーシングのみに使用する場合は、[Platforms (プラットフォーム)] > [プラットフォーム] > [Generate Nanite Fallback Meshes (Nanite フォールバック メッシュを生成)] をオフにします。 オフにすると、Nanite フォールバック メッシュがビルドから削除され、通常、プロセス内で多くのメモリが節約されます。 レイ トレーシングは、代わりにレイ トレーシング プロキシを使用し、必要に応じてそれをストリーミングします (必要に応じてインデックスおよび頂点バッファとともに)。
フォールバック メッシュが必要な場合 (Niagara の場合など)、個別にこれを有効化できます。 [Allow CPUAccess (CPU アクセスを許可)] などの設定を切り替えて、フォールバック メッシュを作成することもできます。
レイ トレーシング モード
インライン レイ トレーシングとレイ トレーシング シェーダーの両方がサポートされているプラットフォームでは、プラットフォームごとのオプションを使用して、レイ トレーシングを有効にする方法を細かく制御することができます。 これは、[Project Settings (プロジェクト設定)] の [Platforms (プラットフォーム)] > [プラットフォーム] > [Ray Tracing Mode (レイ トレーシング モード)] にあります。
ここには、次のモードがあります。
Disabled (無効):このプラットフォームの全てのレイ トレーシングが無効になります。
Inline (インライン): サーフェス キャッシュと重心/トラバーサル デバッグ表示を含む Lumen ハードウェア レイ トレーシング モードなどのインライン レイトレーシング パスのみが有効になります。 このモードでは、レイ トレーシング マテリアル シェーダーと選択したグローバル シェーダーはコンパイルされません。 これにより、レイ トレーシング シェーダーのバインディングを準備する必要がなくなり、メモリと CPU コストを節約できます。
Full (フル):このプラットフォームでは、レイ トレーシングのすべての機能がサポートされています。
トップ レベル アクセラレーション構造のビルド
トップ レベル アクセラレーション構造はフレームごとに再ビルドされ、レンダリング スレッド、RHI スレッド、および GPU で負荷が発生します。 これらの負荷は、アクセラレーション構造に含まれるメッシュ インスタンスの数にほぼ比例します。
stat コマンド Stat SceneRendering を使用すると、Ray tracing instances (レイ トレーシング インスタンス) でフレームごとに再ビルドされるインスタンス数を確認できます。
レンダリング スレッドの負荷を測定するには、Stat SceneRendering コマンドを使用して、GatherRayTracingWorldInstances を探します。
RHI スレッドの負荷を測定するには、Stat D3D12RayTracing などで、RHI ごとの統計を使用できます。
GPU の負荷は、stat コマンド Stat GPU を使用して測定できます。 RayTracingScene エントリおよび RayTracing エントリを見ると、その負荷がわかります。
次世代コンソールで 30 fps の目標を達成するためには、カリング後のレイ トレーシング シーンのインスタンス数が、通常、100,000 個以下である必要があります。 Windows では、このインスタンス数が大幅に変わることがあります。
カリング
レイ トレーシングを使用しているシーンでは、カメラ ビューの外側のオブジェクトがシーン内に存在する必要があります。これは、特に、反射率の高いサーフェスに該当し、 シーンのレンダリングにかかる負荷が増大します。 表示されていない、または必要でないオブジェクトをカリングすると、パフォーマンスの最適化に役立ちます。
レイ トレーシングでは、オブジェクトが視界内にない場合でも、オブジェクトを常に表示しておく必要があるため、コンソール変数 r.RayTracing.Culling には、現在のビューの外側にあるオブジェクトとその距離を最適化するためのオプションが用意されています。
以下のオプションが提供されています。
1:距離と立体角に基づいてカメラの後ろにあるオブジェクトをカリングします (レイ トレーシングのデフォルトのカリング手法)。
2:距離と立体角に基づいてカメラの前後にあるオブジェクトをカリングします。
3:距離または立体角に基づいてカメラの前後にあるオブジェクトをカリングします。
各カリング オプションでは、レイ トレーシング シーンにあるより多くのオブジェクトが徐々にカリングされます。
TLAS はフレームごとに再ビルドされるため、オプション 3 を設定すると、カメラとの距離または角度に基づいてメッシュ インスタンスがカリングされることがあります。
また、[Ray Tracing Culling (レイ トレーシングのカリング)] オプションで使用される [Radius (半径)] と [Angle (角度)] は、以下のコンソール コマンドを使用して、それぞれ設定することができます。
r.RayTracing.Culling.Radius:カメラ周辺の距離を設定し、その距離を超えるとオブジェクトがカリングされます。 デフォルトの半径は 10000 (100m) です。r.Raytracing.Culling.Angle: 投影角度が 5 度未満の小さいメッシュをカリングします。 デフォルト値は 1 です。
City Sample のようなオープン ワールド プロジェクトでは、反射面が多く、オブジェクトを遠くからでも表示する必要がある広い領域を考慮して、カリングの Radius (半径) は 15000 (150 メートル) に増やし、カリングの Angle (角度) は 0.5 (2.5 度) に減らしました。
カリングによりレイ トレーシング シーンの範囲が狭まるため、遠くのジオメトリのトレースを提供するには Far Field (ファー フィールド) と組み合わせるのが最善です。
Ray Tracing Group ID (レイ トレーシング グループ ID) が 0 より大きいタグ付きメッシュ コンポーネントは、r.RayTracing.Culling.UserGroupIds 1 を使用して集約的にカリングできます。 この方法は、シーンが多数の異なるパーツで構成され、それらを単一のオブジェクトとしてカリングしたい場合に便利です。
レベルで選択したアクタの Ray Tracing Group ID (レイ トレーシング グループ ID) プロパティ。
レイ トラバーサルの負荷
レイ クエリは、レイ トレーシング シャドウ、Lumen グローバル イルミネーション、Lumen 反射などのハードウェア レイ トレーシングを使用する機能でスポーンされます。 GPU は、これらのレイ クエリを、アクセラレーション構造をトラバースしてヒットを検出する専用ハードウェアにより解決します。
以下は、プロファイル GPU ログ出力のレイ トラバーサルに伴う負荷の例です。
2.36ms LumenReflections 1 draw 1 prims 0 verts 13 dispatches 4.1% 0.67ms ReflectionHardwareRayTracing [default] <indirect> 1 draw 1 prims 0 verts 1 dispatch 1 groups
レイ トラバーサルの負荷は、ライティング機能によって発行されるレイ クエリの数、およびシーン内のメッシュのオーバーラップ量に比例します。
メッシュがオーバーラップしている場合、レイ トレーシングは 2 つのレベルのアクセラレーション構造を使用するため、光線がすべてのメッシュを個別にトラバースして最も近いヒットを見つける必要があります。 メッシュのオーバーラップは、必要に応じて異なるアセットを組み合わせて作成されたシーン (キットバッシングとも呼ばれる) で、レイ トラバーサルに非常に時間がかかる原因になります。
Unreal Engine 5 の「古代の谷」テクニカル デモで、岩を重ねるために使用したキットバッシュ アセットの例。
ハードウェア レイ トレーシングと互換性のあるシーンを作成するためには、メッシュの重なりを最小限に抑える必要があります。
レイ トラバーサルの負荷が増大するよくある原因は他にもあります。1 つ目はスカイボックスです。スカイボックスは、シーン全体に重なるため、たとえ光線が当たっていない場合でも、すべての光線によってトラバースされる必要があります。 もう 1 つは草です。草は境界が大きく、ジオメトリの複雑性が高くなります。
これらのケース (または類似の他のケース) では、そういったレイ トレーシングがこれらのメッシュをスキップするように選択することができます。 ワールドでアクタを選択して、その [Details (詳細)] パネルで [Visible in Ray Tracing (レイトレーシングで可視化)] を無効にします。
レイ トラバーサル デバッグ ビジュアライゼーション モード
以下のデバッグ モードは、現在コンソール プラットフォームでのみ利用可能です。
トラバーサルの大きな負荷を調査するのに役立つデバッグ モードが 2 つあります。パフォーマンスとトラバーサルです。
これらのモードを有効にするには、次のコマンドを使用します。
show raytracingdebug 1
r.RayTracing.DebugVisualizationMode [mode]「Mode (モード)」の部分は、希望の可視化メソッド Performance (パフォーマンス) または Traversal Node (トラバーサル ノード) に置き換えられます。 たとえば、r.RayTracing.DebugVisualizationMode Traversal Node のようになります。
パフォーマンス デバッグ ビジュアライゼーション
Performance (パフォーマンス) デバッグ可視化では、TraceRay 呼び出しのヒートマップが表示され、BVH トラバーサル時間とマテリアル評価時間 (Closest Hit/Miss シェーダーの実行) を合わせた時間が表示されます。
レイ トレーシング パフォーマンス デバッグ可視化。
ビジュアライゼーションの色は、紫 (負荷なし) から黄色 (高負荷) へと変化します。 ヒートマップのスケールは、r.RayTracing.DebugTiming Scale を使用して、プロジェクトのニーズに合わせて調整することができます。
このモードは、レイ トレーシングで問題のあるオブジェクトやマテリアルを見つけるのに最も役立ちます。 レイ トレーシングの負荷が大きすぎる場合、このモードで表示されている内容が妥当かを確認することをお勧めします。
たとえば、メイン ビューに表示されているオブジェクトがデバッグ モードでも表示されており、不要なオブジェクトは含まれておらず、それらのオブジェクトのマテリアル負荷が予想どおりに表示されているとします。 際立った特徴がない場合、速度低下は 1 つのオブジェクトが原因ではなく、異なる小さな問題が組み合わさって原因となっている場合があります。
トラバーサル デバッグ ビジュアライゼーション
Traversal (トラバーサル) デバッグ可視化では、BVH トラバーサル (ヒットを見つけるのに必要な反復回数) のみのヒートマップが表示されます。 マテリアルを使用しない Lumen パスや、シンプルなヒット シェーディング/インラインを使用する同様のパスの場合、最も負荷が大きいのは、通常、BVH トラバーサルです。
ヒートマップの色は、緑 (イテレーション回数が少ない) から赤 (イテレーション回数が多い) へと変化していきます。 直感的には、イテレーション回数が多いほど、トラバーサルの速度は低下します。 一般的なシーンでは、この値は 50 ~ 100 イテレーションになります。 複数のハイポリゴン メッシュが重なり合うような複雑なシーンでは、約 100 ~ 150 イテレーションになります。
値がこれ以上である場合は、問題がある可能性があります。たとえば、壊れたメッシュでは、1000 回以上のイテレーションになることも珍しくありません。 トラバーサル三角ポリゴン デバッグ ビジュアライゼーションは、個々のメッシュの三角ポリゴンを確認するのに役立ちます。
トラバーサル デバッグでは、次の 3 つのモードを選択できます。
| トラバーサル デバッグ モード | コマンド名 | 説明 | ビジュアライゼーション ビュー |
|---|---|---|---|
Node Intersection Count (ノード交差数) |
| シーンのトラバーサルの負荷を調査するために使用します。 たとえば、TLAS で多くのインスタンスが重なっている場合が挙げられます。 これらは、BLAS の内部のプラットフォーム固有の表現での BVH ノードです。 | |
Triangle Intersection Count (三角形交差数) |
| 三角ポリゴンのみを含むノード (リーフ ノード) のヒット数が表示されます。 | |
Total Intersection Count (総交差数) |
| BVH ノードのヒット数と三角ポリゴン ノードのヒット数の合計。 |
ヒット シェーディングの負荷
光線が三角ポリゴンにヒットすると、そのマテリアルが評価され、ヒット ポイントのシェーディングに使用されます。 プロシージャル テクスチャリングと多数のバーチャル テクスチャを使用する複雑なマテリアルの場合、これはきわめて負荷の高いプロセスになる可能性があります。
Ray Tracing Quality Switch (レイ トレーシング品質スイッチ) ノードは、マテリアル内で使用できる式であり、レイヒット時のシェーディングをより低コストで実装するために利用されます。
このノードは、レイ トレーシング機能の全体的な負荷を軽減するために、マテリアル ロジックの部分全体を置き換えることができます。 このノードを使用すると、このマテリアルのすべてのレイ トレーシング エフェクトに影響を及ぼします。
簡単な例 (以下を参照) として、レイ トレーシング エフェクトに負荷がかかるロジックを含むマテリアルがあります。 RayTracingQualitySwitch ノードには、Normal と RayTraced の 2 つの入力があります。
Normal (通常) 入力には、マテリアルに必要な全てのロジックが含まれ、ワールド内のサーフェス上に通常通り表示されます。 RayTraced (レイ トレーシング時) 入力では、法線マップなどのレイ トレーシング エフェクトの負荷を増大させるロジック パスが簡略化されます。
画像をクリックすると拡大表示されます。
ファー フィールド
レイ トレーシングは、デフォルトで、Lumen のグローバル イルミネーションおよび反射を、カメラから 1 km まで拡張するファー フィールド表現をサポートしています。 ファー フィールドでは、デフォルトで、World Partition (ワールド パーティション) によって生成される Hierarchical Level of Detail (階層的詳細レベル、HLOD) メッシュが使用されます。 ファー フィールドの表現には HLOD1 メッシュが使用されます。
現在、Lumen ライティング機能のみが Ray Tracing Far Field (レイ トレーシングのファー フィールド) を使用し、使用できるのもコマンド r.LumenScene.FarFields 1 でプロジェクトで有効な場合のみです。
ファー フィールドで表示するメッシュを選択して、[Ray Tracing Far Field (レイ トレーシングのファー フィールド)] 設定を切り替えます。
エディタでは、FarField のレイ トレーシング デバッグ可視化モードを使用して、ファー フィールドを可視化できます。 次のコマンドを入力します。
r.RayTracing.DebugVisualizationMode FarField
Showflag.RayTracingDebug 1以下のビジュアライゼーションでは、ファー フィールドはワールド パーティションで生成された HLOD1 メッシュを使用した、赤で色付けされているジオメトリです。 カメラに近い要素は高精細ジオメトリです。
Lumen のレイ トレーシング ファー フィールド デバッグ可視化。 ファー フィールドのジオメトリは、赤で色付けされています。
その他のレイ トレーシング デバッグ ビジュアライゼーション モード
レイ トレーシング デバッグ可視化モードを使用すると、レイ トレーシング シーンに関する情報を集めることができます。
これらのビジュアライゼーション モードにアクセスするには、レベル ビューポートで [View Modes (表示モード)] ドロップダウンから選択するか、コンソール コマンド r.RayTracing.DebugVisualizationMode の後に可視化モード名を指定します。
Picker デバッグ ビジュアライゼーション モード
Picker Debug Visualization Mode (Picker デバッグ可視化モード) では、 カーソルの下にあるレイ トレーシング ジオメトリおよびインスタンスに関する情報が表示されます。 Picker モードは、Triangles (トライアングル) と Instances (インスタンス)の 2 つの異なるドメインで動作します。
これらのモードを切り替えるには、コンソール コマンド r.RayTracing.Debug.PickerDomain に続けて、三角形の場合は0* (デフォルト)、インスタンスの場合は 1 を入力します。
ビューポートの左側に、レイ トレーシング ジオメトリに関する情報およびどの Picker ドメインが現在使用されているかが表示されています。
Dynamic Instances デバッグ ビジュアライゼーション モード
Dynamic Instance デバッグ可視化モードでは、レイ トレーシング シーン内の動的インスタンスが表示されます。 フレームごとに動的インスタンスが再ビルドされ、静的インスタンスの場合は赤 、動的インスタンスの場合は緑で表示されます。