レイ トレーシング パフォーマンス ガイド

プロジェクトでレイ トレーシング機能のパフォーマンスを向上させるためのいくつかのトピックについて説明します。

Choose your operating system:

Windows

macOS

Linux

リアルタイム パフォーマンスのバジェットを維持する必要があるプロジェクトで重要なのは、ターゲットとするフレーム レートを達成できるフレーム バジェットを設定することです。通常、これは 30 または 60 フレーム/秒 (FPS) です。コンテンツやワークフローを調整することで、さまざまなケースでプロジェクトのパフォーマンスを最適化し、向上させることができます。

このガイドでは、Unreal Engine のレイ トレーシング機能を最適化するための出発点と、シーンのデバッグや問題の調査を通じて問題箇所を正確に特定する方法について説明します。

レイ トレーシングの負荷の概要

ハードウェア レイ トレーシングは、2 つのレベルの バウンディング ボリューム階層 (BVH) を使用してレイ トラバーサルを高速化します。トップ レベル アクセラレーション構造 (TLAS) には、シーン全体のすべてのメッシュ インスタンスが含まれます。これらのインスタンスによって参照されるメッシュは、ボトム レベル アクセラレーション構造 (BLAS) です。

下の図は、BVH がレイ トラバーサルでどのように機能するかを示した図です。

diagram of ray tracing acceleration structure

レイ トレーシングに伴う処理は、主に次の 3 つに分類されます。

  1. スキン メッシュ、ヘアなど、動的に変形するメッシュのためのボトム レベル アクセラレーション構造をビルドする。

  2. シーンおよびシェーダー バインディング テーブル (SBT) 用のトップ レベル アクセラレーション構造をビルドする。

  3. レイ トレーシングを使用する各機能のためのレイ トラバーサルを実行する。

プロジェクトの開発では、コンソール変数を使用して、特定のタイプのジオメトリのレイ トレーシングに伴う負荷をテストすることができます。これは、レイ トレーシング機能で、そういった負荷を測定したり、完全に無効にしたりするうえで役立ちます。これらは、r.RayTracing.Geometry.* でリストされます。

ジオメトリ タイプ

コンソール変数

デフォルトの状態

スタティック メッシュ

r.RayTracing.Geometry.StaticMeshes

有効

スケルタル メッシュ

r.RayTracing.Geometry.SkeletalMeshes

有効

インスタンス化されたスタティック メッシュ

r.RayTracing.Geometry.InstancedStaticMeshes

有効

ランドスケープ テレイン

r.RayTracing.Geometry.Landscape

有効

ジオメトリ キャッシュ

r.RayTracing.Geometry.GeometryCache

有効

ジオメトリ コレクション

r.RayTracing.Geometry.GeometryCollection

無効

Niagara メッシュ

r.RayTracing.Geometry.NiagaraMeshes

有効

Niagara リボン

r.RayTracing.Geometry.NiagaraRibbons

有効

Niagara スプライト

r.RayTracing.Geometry.NiagaraSprites

有効

プロシージャルなメッシュ

r.RayTracing.Geometry.ProceduralMeshes

有効

ボトム レベル アクセラレーション構造の更新

スタティック メッシュの BLAS はロード時 (コンソールではクック時) に一度だけビルドされますが、動的に変形するメッシュはフレームごとに再ビルドする必要があり、これには大きな負荷がかかります。BLAS の再ビルドは GPU の演算処理であり、通常、変形される三角ポリゴンの総数に比例します。**多くの三角ポリゴンで構成されるスケルタル メッシュを多用すると、たちまち GPU の負荷が大幅に増大します。

BLAS の再ビルドにかかる負荷は、GPU プロファイラの次の箇所で確認できます。

  • Scene > CommitRayTracingGeometryUpdates

  • Scene > CommitHairRayTracingGeometryUpdates

  • Scene > RayTracingGeometry

フレームごとに再ビルドを行うジオメトリ タイプは以下のとおりです。

  • GPUSkinCache を使用したスキン メッシュ

  • ランドスケープ。モーフィングの詳細度 (LOD) を継続的にサポートするために再ビルドされる

  • ケイオス破壊用のジオメトリ コレクション

  • ヘア

  • プロシージャル メッシュ

  • 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 でフレームごとに再ビルドされるインスタンス数を確認できます。

ray tracing instances in stat scenerendering

レンダリング スレッドの負荷を測定するには、Stat SceneRendering コマンドを使用して、GatherRayTracingWorldInstances を確認します。

gather ray tracing world instances in stat scenerendering

RHI スレッドの負荷を測定するには、Stat D3D12RayTracing などの RHI ごとの統計情報を使用することができます。

measure cost of rhi thread in stat d3d12raytracing

GPU の負荷は、stat コマンド Stat GPU を使用して測定できます。RayTracingScene エントリおよび RayTracing エントリを確認すると、その負荷を把握できます。

GPU cost measured with stat GPU

次世代コンソールで 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 などのオープン ワールドのプロジェクトでは、反射サーフェスが多い広大なエリアではより遠くにあるオブジェクトが見えるように考慮して、カリング 半径 を 15000 (150 m) に上げて、カリング 角度 は、0.5 (2.5 度) に下げました。

カリングによりレイ トレーシング シーンでカバーされていない部分が発生するため、遠くのジオメトリにトレースを提供できるようにするため、 ファー フィールド と併用することをお勧めします。

「0」より大きい [Ray Tracing Group Id (レイ トレーシング グループ ID)] でタグ付けされた複数のメッシュ コンポーネントは、r.RayTracing.Culling.UserGroupIds 1 を使用して単一の集合体としてカリングされることがあります。この方法は、シーンが多くの異なるパーツで構成されているものの、それらを単一のオブジェクトとしてカリングしたい場合に役立ちます。

ray tracing details panel settings

レベルで選択したアクタの Ray Tracing Group 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 つのレベルのアクセラレーション構造を使用するため、光線がすべてのメッシュを個別にトラバースして最も近いヒットを見つける必要があります。メッシュのオーバーラップは、必要に応じて異なるアセットを組み合わせて作成されたシーン (キットバッシングとも呼ばれる) で、レイ トラバーサルに非常に時間がかかる原因になります。

overlapping meshes

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 トラバーサル時間とマテリアル評価時間 (クローゼスト ヒット/ミス シェーダーの実行) を合わせた時間を表示します。

performance debug visualization

レイ トレーシング パフォーマンス デバッグ ビジュアライゼーション。

ビジュアライゼーションの色は、紫 (負荷なし) から黄色 (高負荷) へと変化します。ヒートマップのスケールは r.RayTracing.DebugTiming Scale を使用してプロジェクトのニーズに合わせて調整することができます。

このモードは、レイ トレーシングで問題のあるオブジェクトやマテリアルを見つけるのに最も役立ちます。レイ トレーシングの負荷が大きすぎる場合、このモードで表示されている内容が妥当であるかを確認することをお勧めします。

たとえば、メイン ビューに表示されているオブジェクトがデバッグ モードでも表示されており、不要なオブジェクトは含まれておらず、それらのオブジェクトのマテリアル負荷が予想通りに表示されているとします。際立った原因がない場合、速度低下の原因が 1 つのオブジェクトにあるのではなく、異なる小さな問題が組み合わさっていることが原因である場合があります。

トラバーサル デバッグ ビジュアライゼーション

トラバーサル デバッグ ビジュアライゼーションでは、BVH トラバーサルのみのヒートマップを表示し、ヒットを検出するために行ったイテレーションの回数を表示します。マテリアルを使用しない Lumen パスや、シンプルなヒット シェーディング/インラインを使用する同様のパスの場合、最も負荷が大きいのは、通常、BVH トラバーサルです。

ヒートマップの色は、緑 (イテレーション回数が少ない) から赤 (イテレーション回数が多い) へと変化していきます。直感的には、イテレーション回数が多いほど、トラバーサルの速度は低下します。一般的なシーンでは、この値は 50 ~ 100 イテレーションになります。複数のハイポリゴン メッシュが重なり合うような複雑なシーンでは、約 100 ~ 150 イテレーションになります。

値がこれ以上である場合は、問題がある可能性があります。たとえば、壊れたメッシュでは、1000 回以上のイテレーションになることも珍しくありません。トラバーサル三角ポリゴン デバッグ ビジュアライゼーションは、個々のメッシュの三角ポリゴンを確認するのに役立ちます。

トラバーサル デバッグでは、次の 3 つのモードを選択できます。

トラバーサル デバッグ モード

コマンド名

説明

ビジュアライゼーション ビュー

Node Intersection Count (ノード交差数)

Traversal Node

シーンのトラバーサルの負荷を調査するために使用します。たとえば、TLAS で多くのインスタンスが重なっている場合などが挙げられます。

これらは、BLAS の内部のプラットフォーム固有の表現での BVH ノードです。

Triangle Intersection Count (三角ポリゴン交差数)

Traversal Triangle

三角ポリゴンのみを含むノード (リーフ ノード) のヒット数を表示します。

Total Intersection Count (総交差数)

Traversal All

BVH ノードのヒット数と三角ポリゴン ノードのヒット数の合計。

ヒット シェーディングの負荷

光線が三角ポリゴンにヒットすると、そのマテリアルが評価され、ヒット ポイントのシェーディングに使用されます。プロシージャル テクスチャリングと多数の仮想テクスチャを使用する複雑なマテリアルの場合、これはきわめて負荷の高いプロセスになる可能性があります。

Ray Tracing Quality Switch ノードは、ヒットした光線のシェーディングに比較的負荷の低い実装を提供するために、マテリアルで使用することができる式です。

ray tracing quality switch material node

このノードは、レイ トレーシング機能の全体的な負荷を軽減するために、マテリアル ロジックの部分全体を置き換えることができます。このノードを使用すると、このマテリアルのすべてのレイ トレーシング エフェクトに影響します。

簡単な例 (以下を参照) として、レイ トレーシング エフェクトに負荷がかかるロジックを含むマテリアルがあります。RayTracingQualitySwitch ノードには、Normal と RayTraced の 2 つのノードがあります。

Normal 入力には、マテリアルに必要なすべてのロジックが含まれており、ワールドのサーフェスでどのように表示されるかを指定します。RayTraced 入力では、法線マップなどのレイ トレーシング エフェクトの負荷を増大させるロジック パスの複雑性を軽減する必要があります。

クリックしてフルサイズ表示

ファー フィールド

レイ トレーシングは、Lumen グローバル イルミネーションと反射をカメラから 1 km まで拡張する ファー フィールド 表現をデフォルトでサポートしています。ファー フィールドは、デフォルトで ワールド パーティションによって生成された階層詳細度 (HLOD) メッシュ が使用されます。ファー フィールドの表現には、HLOD1 メッシュが使用されます。

現在、Lumen ライティング機能のみが レイ トレーシングのファー フィールド を使用し、コマンド r.LumenScene.FarFields 1 でプロジェクトに対して有効にした場合のみ使用可能です。

ファー フィールドで表示する必要のある選択されたメッシュで、[Ray Tracing Far Field (ファー フィールドのレイ トレーシング)] 設定を切り替えます。

ray tracing far field setting

エディタでは、FarField のレイ トレーシング デバッグ ビジュアライゼーション モードを使用してファー フィールドを視覚化することができます。次のコマンドを入力します。

r.RayTracing.DebugVisualizationMode FarField
Showflag.RayTracingDebug 1

以下のビジュアライゼーションでは、ファー フィールドはワールド パーティションで生成された HLOD1 メッシュを使用した赤で着色されたジオメトリです。カメラに近い要素は高精細ジオメトリです。

far field visualization

Lumen のレイ トレーシング ファー フィールド デバッグ ビジュアライゼーション。ファー フィールドのジオメトリは赤く色付けされている。