リアルタイム パフォーマンスのバジェットを維持する必要があるプロジェクトで重要なのは、ターゲットとするフレーム レートを達成できるフレーム バジェットを設定することです。通常、これは 30 または 60 フレーム/秒 (FPS) です。コンテンツやワークフローを調整することで、さまざまなケースでプロジェクトのパフォーマンスを最適化し、向上させることができます。
このガイドでは、Unreal Engine のレイ トレーシング機能を最適化するための出発点と、シーンのデバッグや問題の調査を通じて問題箇所を正確に特定する方法について説明します。
レイ トレーシングの負荷の概要
ハードウェア レイ トレーシングでは、2 つのレベルの バウンディング ボリューム階層 (BVH) を使用してレイ トラバーサルを高速化します。トップ レベル アクセラレーション構造 (TLAS) には、シーン全体のすべてのメッシュ インスタンスが含まれます。それらのインスタンスによって参照されるメッシュは、ボトム レベル アクセラレーション構造 (BLAS) です。
下の図は、BVH がレイ トラバーサルでどのように機能するかを視覚的に表現しています。
レイ トレーシングに伴う処理は、主に次の 3 つに分類されます。
- スキン メッシュ、ヘアなど、動的に変形するメッシュのためのボトム レベル アクセラレーション構造をビルドする。
- シーンおよびシェーダー バインディング テーブル (SBT) 用のトップ レベル アクセラレーション構造をビルドする。
- レイ トレーシングを使用する各機能のためのレイ トラバーサルを実行する。
プロジェクトの開発では、コンソール変数を使用して、特定のタイプのジオメトリのレイ トレーシングに伴う負荷をテストすることができます。これは、レイ トレーシング機能で、そういった負荷を測定したり、完全に無効にしたりするうえで役立ちます。これらは、r.RayTracing.Geometry.*
の下に一覧表示されます。
ジオメトリ タイプ | コンソール変数 | デフォルトの状態 |
---|---|---|
スタティックメッシュ | r.RayTracing.Geometry.StaticMeshes |
有効 |
スケルタルメッシュ | r.RayTracing.Geometry.SkeletalMeshes |
有効 |
インスタンス化されたスタティックメッシュ | r.RayTracing.Geometry.InstancedStaticMeshes |
有効 |
ランドスケープ テレイン | r.RayTracing.Geometry.Landscape |
有効 |
ジオメトリ キャッシュ | r.RayTracing.Geometry.GeometryCache |
有効 |
Geometry Collection | r.RayTracing.Geometry.GeometryCollection |
無効 |
Niagara メッシュ | r.RayTracing.Geometry.NiagaraMeshes |
有効 |
Niagara リボン | r.RayTracing.Geometry.NiagaraRibbons |
有効 |
Niagara スプライト | r.RayTracing.Geometry.NiagaraSprites |
有効 |
プロシージャル メッシュ | r.RayTracing.Geometry.ProceduralMeshes |
有効 |
ボトム レベル アクセラレーション構造の更新
スタティックメッシュの BLAS はロード時 (コンソールではクック時) に 1 度だけビルドされますが、動的に変形するメッシュはフレームごとに再ビルドする必要があり、これには大きな負荷がかかります。BLAS の再ビルドは GPU の演算処理であり、通常、変形される三角ポリゴンの総数に比例します。多数の三角ポリゴンで構成されるスケルタルメッシュを多用すると、たちまち GPU の負荷が大幅に増大します。
BLAS の再ビルドにかかる負荷は、GPU プロファイラの次の箇所で確認できます。
- Scene > CommitRayTracingGeometryUpdates
- Scene > CommitHairRayTracingGeometryUpdates
- Scene > RayTracingGeometry
以下のジオメトリ タイプではフレームごとに再ビルドが行われます。
- GPUSkinCache を使用したスキン メッシュ
- ランドスケープ。モーフィングの詳細度 (LOD) を継続的にサポートするために再ビルドされる
- Chaos 破壊用の Geometry Collection
- ヘア
- プロシージャル メッシュ
- Niagara パーティクル システム
ハイポリゴン スケルタルメッシュは、BLAS のビルドの負荷が増大する原因として最もよく見られます。スケルタルメッシュでは、スケルタルメッシュ エディタ にある Ray Tracing Min LOD プロパティを使用できます。このプロパティを使用すると、レイ トレーシング機能で最も高い LOD が使用されないように設定できます。
D3D12 を使用してプロジェクトを実行しているときに、D3D12.DumpRayTracingGeometries
コンソール コマンドを使用すると、ログにダンプされた動的 BLAS 再ビルドのすべてのメモリ割り当てのリストを取得できます。このリストは、プロジェクトを最適化するために使用することができます。
スタティックメッシュ コンポーネントでのワールド位置オフセット
ワールド位置オフセット (WPO) とレイ トレーシング機能の併用を効率的にサポートすることは困難です。なぜなら、BLAS を動的に再ビルドするだけでなく、各インスタンスに対しても固有のメモリが必要になるためです。
デフォルトでは、Unreal Engine はレイ トレーシング シーンのビルド時に WPO を無視するため、自己交差アーティファクトが発生する可能性があります。スタティックメッシュ コンポーネントでは、[Evaluate World Position Offset (ワールド位置オフセットを評価)] 設定で、レイ トレーシングで WPO を使用するように選択できます。ただし、特に指定がない限り、カメラの周りの短距離 (50m) でのみ機能します。
サポートされている WPO のカメラからの距離を有効にして調整するには、以下のように指定します。
r.RayTracing.Geometry.StaticMeshes.WPO 1
r.RayTracing.Geometry.StaticMeshes.WPO.CullingRadius 5000.0f
WPO に起因する動的な BLAS のビルドは、GPU プロファイラの Scene > RayTracingGeometry > RayTracingDynamicGeometryUpdate
の下に表示されます。
インスタンス化されたスタティックメッシュ コンポーネントなどのインスタンス化されたコンポーネントは、デフォルトでは WPO をサポートしません。これは、WPO の負荷がきわめて大きいためです。[Evaluate World Position Offset] トグルがあるコンポーネントは、デフォルトでは WPO が有効になっていません。このトグルをオンにすると、1 つのメッシュのすべてのインスタンスを個別の BLAS で効果的に変換するため、メモリ負荷が大幅に増大し、レンダリングに時間がかかる可能性があります。
トップ レベル アクセラレーション構造のビルド
トップ レベル アクセラレーション構造はフレームごとに再ビルドされ、レンダリング スレッド、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 (150m) に上げ、カリングの [Angle] を 0.5 (2.5 度) に下げました。
カリングによりレイ トレーシング シーンでカバーされていない部分が発生するため、遠くのジオメトリにトレースを提供できるようにするため、ファー フィールド と併用することをお勧めします。
「0」より大きい [Ray Tracing Group Id (レイ トレーシング グループ ID)] でタグ付けされている複数のメッシュ コンポーネントは、r.RayTracing.Culling.UserGroupIds 1
を使用して単一の集合体としてカリングされることがあります。この方法は、シーンが多くの異なるパーツで構成されているものの、それらを単一のオブジェクトとしてカリングしたい場合に役立ちます。
レイ トラバーサルの負荷
レイ クエリは、レイ トレーシング シャドウ、Lumen グローバル イルミネーション、Lumen 反射などの ハードウェア レイ トレーシング を使用する機能でスポーンされます。GPU は、これらのレイ クエリを、アクセラレーション構造をトラバースしてヒットを検出する専用ハードウェアにより解決します。
以下は、プロファイル GPU ログ出力のレイ トラバーサルに伴う負荷の例です。
2.36ms LumenReflections 1 draw 1 prims 0 verts 13 dispatches
4.1% 0.67ms ReflectionHardwareRayTracing [default]
レイ トラバーサルの負荷は、ライティング機能によって発行されるレイ クエリの数、およびシーン内のメッシュのオーバーラップ量に比例します。
メッシュがオーバーラップしている場合、レイ トレーシングは 2 つのレベルのアクセラレーション構造を使用するため、光線がすべてのメッシュを個別にトラバースして最も近いヒットを見つける必要があります。メッシュのオーバーラップは、必要に応じて異なるアセットを組み合わせて作成されたシーン (キットバッシングとも呼ばれる) で、レイ トラバーサルに非常に時間がかかる原因になります。
ハードウェア レイ トレーシングと互換性のあるシーンを作成するためには、メッシュのオーバーラップを最小限に抑える 必要があります。
レイ トラバーサルの負荷が増大するよくある原因は他にもあります。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 トラバーサル時間とマテリアル評価時間 (クローゼスト ヒット/ミス シェーダーの実行) を合わせた時間が表示されます。
ビジュアライゼーションの色は、紫 (負荷なし) から黄色 (高負荷) へと変化します。ヒートマップのスケールは r.RayTracing.DebugTiming Scale
を使用してプロジェクトのニーズに合わせて調整することができます。
このモードは、レイ トレーシングで問題のあるオブジェクトやマテリアルを見つけるのに最も役立ちます。レイ トレーシングの負荷が大きすぎる場合、このモードで表示されている内容が妥当であるかを確認することをお勧めします。
たとえば、メイン ビューに表示されているオブジェクトがデバッグ モードでも表示されており、不要なオブジェクトは含まれておらず、それらのオブジェクトのマテリアル負荷が予想どおりに表示されているとします。際立った特徴がない場合、速度低下は 1 つのオブジェクトが原因ではなく、異なる小さな問題が組み合わさって原因となっている場合があります。
トラバーサル デバッグ ビジュアライゼーション
Traversal デバッグ ビジュアライゼーションでは、BVH トラバーサルのみのヒートマップが表示され、ヒットを検出するために行ったイテレーションの回数が表示されます。マテリアルを使用しない Lumen パスや、シンプルなヒット シェーディング/インラインを使用する同様のパスの場合、最も負荷が大きいのは、通常、BVH トラバーサルです。
ヒートマップの色は、緑 (イテレーション回数が少ない) から赤 (イテレーション回数が多い) へと変化していきます。直感的には、イテレーション回数が多いほど、トラバーサルの速度は低下します。一般的なシーンでは、この値は 50 ~ 100 イテレーションになります。複数のハイポリゴン メッシュが重なり合うような複雑なシーンでは、約 100 ~ 150 イテレーションになります。
値がこれ以上である場合は、問題がある可能性があります。たとえば、壊れたメッシュでは、1000 回以上のイテレーションになることも珍しくありません。トラバーサル三角ポリゴン デバッグ ビジュアライゼーションは、個々のメッシュの三角ポリゴンを確認するのに役立ちます。
トラバーサル デバッグでは、次の 3 つのモードを選択できます。
トラバーサル デバッグ モード | コマンド名 | 説明 | ビジュアライゼーション ビュー |
---|---|---|---|
Node Intersection Count | Traversal Node |
シーンのトラバーサルの負荷を調査するために使用します。たとえば、TLAS で多くのインスタンスが重なっている場合が挙げられます。 |
|
Triangle Intersection Count | Traversal Triangle |
三角ポリゴンのみを含むノード (リーフ ノード) のヒット数が表示されます。 | |
Total Intersection Count | Traversal All |
BVH ノードのヒット数と三角ポリゴン ノードのヒット数の合計。 |
ヒット シェーディングの負荷
光線が三角ポリゴンにヒットすると、そのマテリアルが評価され、ヒット ポイントのシェーディングに使用されます。プロシージャル テクスチャリングと多数のバーチャル テクスチャを使用する複雑なマテリアルの場合、これはきわめて負荷の高いプロセスになる可能性があります。
Ray Tracing Quality Switch ノードは、ヒットした光線のシェーディングに比較的負荷の低い実装を提供するために、マテリアルで使用できる式です。
このノードは、レイ トレーシング機能の全体的な負荷を軽減するために、マテリアル ロジックの部分全体を置き換えることができます。このノードを使用すると、このマテリアルのすべてのレイ トレーシング エフェクトに影響を及ぼします。
簡単な例 (以下を参照) として、レイ トレーシング エフェクトに負荷がかかるロジックを含むマテリアルがあります。RayTracingQualitySwitch ノードには、Normal と RayTraced の 2 つのノードがあります。
Normal 入力には、マテリアルに必要なすべてのロジックが入っており、ワールドのサーフェスでどのように表示されるかが指定されます。RayTraced 入力では、法線マップなどのレイ トレーシング エフェクトの負荷を増大させるロジック パスの複雑性を軽減する必要があります。
ファー フィールド
レイ トレーシングでは、Lumen グローバル イルミネーションと反射をカメラから 1km まで拡張する ファー フィールド 表現がデフォルトでサポートされています。ファー フィールドでは、デフォルトで World Partition によって生成される Hierarchical Level of Detail (HLOD) メッシュ が使用されます。ファー フィールドの表現には HLOD1 メッシュが使用されます。
現在、レイ トレーシングのファー フィールド が使用されているのは Lumen ライティング機能のみであり、コマンド r.LumenScene.FarFields 1
でプロジェクトに対して有効にした場合にのみ利用可能です。
ファー フィールドで表示する必要のある選択されたメッシュで、[Ray Tracing Far Field (ファー フィールドのレイ トレーシング)] 設定を切り替えます。
エディタでは、FarField
のレイ トレーシング デバッグ ビジュアライゼーション モードを使用してファー フィールドを視覚化できます。次のコマンドを入力します。
r.RayTracing.DebugVisualizationMode FarField
Showflag.RayTracingDebug 1
以下のビジュアライゼーションでは、ファー フィールドはワールド パーティションで生成された HLOD1 メッシュを使用した、赤で色付けされているジオメトリです。カメラに近い要素は高精細ジオメトリです。
その他のレイ トレーシング デバッグ ビジュアライゼーション モード
レイ トレーシング デバッグ ビジュアライゼーション モードを使用すると、レイ トレーシング シーンに関する情報を集めることができます。
これらのビジュアライゼーション モードにアクセスするには、レベル ビューポートで [View Modes (表示モード)] ドロップダウン選択を使用するか、コンソール コマンド r.RayTracing.DebugVisualizationMode
の後にビジュアライゼーション モードの名前を指定します。
Picker デバッグ ビジュアライゼーション モード
Picker
デバッグ ビジュアライゼーション モードでは、レイ トレーシング ジオメトリおよびカーソルが置かれているインスタンスに関する情報が表示されます。Picker モードは次の 2 つの異なるドメインで動作できます。Triangles と Instances。
これらのモードを切り替えるには、コンソール コマンド r.RayTracing.Debug.PickerDomain
の後に、Triangles (デフォルト) の場合は 0*、Instances の場合は 1 を指定します。
Triangles デバッグ Picker ドメイン | Instances デバッグ Picker ドメイン |
画像をクリックするとフルサイズで表示されます。 | 画像をクリックするとフルサイズで表示されます。 |
ビューポートの左側に、レイ トレーシング ジオメトリに関する情報およびどの Picker ドメインが現在使用されているかが表示されています。
Dynamic Instances デバッグ ビジュアライゼーション モード
Dynamic Instances
デバッグ ビジュアライゼーション モードでは、レイ トレーシング シーン内の動的インスタンスが表示されます。動的インスタンスは、フレームごとに再ビルドされ、静的インスタンスは 赤色、動的インスタンスは 緑色 で表示されます。