64.

UE5の高解像度スクショでシェーダコンパイルに待たされる問題の原因と対策

編集

Unreal Engine 5(UE5)で「Take High Res Screenshot(高解像度スクリーンショット)」を実行したときに「シェーダをコンパイル」と表示されて長時間待たされるのは、高解像度撮影では通常のビューポート表示とは異なるレンダリング経路(タイル分割描画・HDR/EXR出力・カスタム深度マスクなど)が使われ、その経路に必要なシェーダ順列(バリエーション)がまだコンパイルされていないために、その場で初めてコンパイルが走るからです。つまり「撮影のたびに重い」のではなく、「その設定でまだ作っていないシェーダを初回に作っている」状態です。原因が分かれば対処は単純で、撮影前にそのシェーダを作り終えておくか、そもそも新しいシェーダを必要としない設定で撮るかのどちらかになります。

この記事の要点
  • 原因:高解像度撮影は通常表示と違う描画経路を通るため、未コンパイルのシェーダ順列がその場でコンパイルされる。
  • 最短の対処:①撮影前にいったん同じ設定で「捨て撮り」して先にコンパイルを終わらせる、②解像度倍率(Screenshot Size Multiplier)を一度下げて試す、③HDR出力・カスタム深度マスクなど追加機能をオフにして撮る。
  • 根本対策:DerivedDataCache(DDC)を共有・温存し、コンパイル済みシェーダを使い回す。必要なら「シェーダ順列の削減」設定で総量を減らす。
  • 落とし穴:その描画経路を初めて使う回は待ちを避けられないことがある。DDCを消すと全シェーダの再コンパイルが発生して再発する。

なぜ「シェーダをコンパイル」が発生するのか

UE5の高解像度スクリーンショットは、画面を複数のタイルに分割し、1タイルずつフル解像度で描画してから1枚に結合する仕組みです。さらに、撮影設定によっては次のような「通常表示では使っていない」機能が有効になります。

  • HDR(EXR)出力:16bitの中間レンダリング結果を書き出すため、通常のsRGB表示とは別の出力経路を通る。
  • カスタム深度マスク(Use Custom Depth as Mask):オブジェクトを切り抜くためのマスク描画が追加される。
  • 高い解像度倍率:内部のバッファサイズやポストプロセスの分岐が変わり、表示時とは別のシェーダ順列が要求されることがある。

UE5では、マテリアルやポストプロセスは「使う条件(順列)ごと」に別々のシェーダへコンパイルされます。通常のプレイ/編集で使う順列は早い段階でコンパイルされてDerivedDataCache(DDC)に保存されますが、上記のように普段通らない経路の順列はまだ作られていないことが多く、高解像度撮影で初めてその経路に入った瞬間にコンパイルが始まります。これが「Take High Res Screenshotを押した途端に待たされる」体感の正体です。

したがって、撮影対象のシーンが複雑(多くのマテリアル・多くのポストプロセス機能)であるほど、初回撮影時に必要となる新規シェーダ順列が増え、待ち時間が長くなります。

最短の対処(まずこれを試す)

急いで1枚撮りたいときは、難しい設定変更より先に次の順で試すのが近道です。

  1. 同じ設定で一度「捨て撮り」しておく:本番と同じ解像度倍率・同じHDR/マスク設定で先に1枚撮ると、必要なシェーダ順列がコンパイルされてDDCに残ります。2枚目以降は同条件なら待たされません。本番カットの前にウォームアップ撮影をしておく運用が最も確実です。
  2. 解像度倍率(Screenshot Size Multiplier)を一度下げる:High Resolution Screenshotツールの倍率を低めにして撮ると、確認が早く済みます。倍率自体より「その経路を初回に通る」ことがコンパイルの引き金なので、まず軽い条件で経路を通してから倍率を上げると体感が改善することがあります。
  3. 追加機能を一度オフにする:HDR出力やカスタム深度マスクが不要なら外して撮ると、その分の追加シェーダが要らなくなります。仕上げで必要になった段階で改めて有効化してウォームアップ撮影します。

コンソールから撮る場合の基本コマンドは次の通りです(数字は解像度倍率)。

HighResShot 2

解像度をピクセル指定で撮りたい場合は、幅×高さを直接指定することもできます。

HighResShot 3840x2160

まず倍率1や低めのピクセル数で1枚撮ってコンパイルを終わらせ、その後に目的の高解像度で撮り直すと、2回目はコンパイル待ちが発生しにくくなります。なお各パラメータの正確な対応はバージョンで変わることがあるため、最終的な指定は公式ドキュメントの確認を推奨します。

根本対策(再発させない)

毎回ウォームアップするのが面倒な場合は、コンパイル済みシェーダを資産として温存・共有する方向で根本対策します。

1. DerivedDataCache(DDC)を温存・共有する

UE5では、コンパイル済みシェーダなどの派生データはDDCに保存されます。一度コンパイルされた順列はDDCに残るため、DDCを消さない限り同じ順列の再コンパイルは原則発生しません。

  • ローカルDDCを消さない:プロジェクトの掃除やクリーン時にDDCまで削除すると、次回起動時に大量の再コンパイルが走ります。
  • 共有DDCを使う:チーム開発では共有(Shared)DDCを設定しておくと、誰かがコンパイルした結果を全員で使い回せ、個々人での初回コンパイルを減らせます。

UE5.4以降ではローカルDDCの方式やパスの既定値が変更されているため、設定や保存場所の詳細は公式ドキュメント(Using Derived Data Cache)の確認を推奨します。

2. シェーダ順列を減らす

そもそもコンパイルすべきシェーダの総量を減らせば、初回コンパイルの負荷も下がります。プロジェクト設定のEngine → Rendering → Shader Permutation Reduction(シェーダ順列削減)カテゴリには、使っていない機能の順列を生成しないようにするオプションがあります。プロジェクトで使わない機能を無効化することで、シェーダ順列を大きく削減できます。

ただし、これらは表示・撮影で使う機能そのものを切る設定です。撮影で必要な品質や機能まで削ると見た目が変わってしまうため、外す項目は慎重に選んでください。

3. 不要な高品質・追加設定を撮影時だけ見直す

撮影に必須でないポストプロセスや追加出力(HDR/マスク等)は、必要なカットだけで使うようにします。常時全機能を有効にしていると、その分だけ「初回に通る経路」が増え、コンパイル待ちの機会も増えます。

待ち時間を減らす設定・運用のまとめ

対策 効果 向いている場面
同条件でウォームアップ撮影2枚目以降のコンパイル待ちをほぼ解消今すぐ本番カットを撮りたい
解像度倍率を一度下げて試す経路を軽く通してから本番へ初回の待ちを短縮したい
HDR/マスクなど追加機能をオフ追加シェーダ順列を削減その機能が不要なカット
DDCを温存・共有再コンパイルの再発を防止チーム開発/継続作業
シェーダ順列削減設定コンパイル総量そのものを削減使わない機能が多いプロジェクト

ポイントは、「撮影前に必要なシェーダを作り終えておく」か「新しいシェーダを必要としない設定で撮る」かのどちらかに寄せることです。コンパイルを高速化するより、コンパイルが発生する瞬間を撮影の本番からずらすほうが、体感の改善は確実です。

落とし穴・注意点
  • 初回の待ちは避けられないことがある:その描画経路・その設定を初めて通る回は、どうしてもコンパイルが必要です。ウォームアップ撮影で「本番からずらす」ことはできても、コンパイル自体をゼロにはできません。
  • DDCを消すと再発する:キャッシュ削除やプロジェクトのクリーン後は、再び大量のシェーダコンパイルが走ります。意図せずDDCを消していないか確認してください。
  • 設定を変えると別順列になる:解像度倍率・HDR・マスクなどを変えるたびに「別の経路」になり、その組み合わせ用のシェーダが新たに必要になることがあります。撮影設定はなるべく固定しておくと待ちが減ります。
  • 順列削減のやりすぎに注意:Shader Permutation Reductionで機能を切ると見た目が変わる場合があります。撮影で使う機能は残してください。

よくある質問(FAQ)

Q1. 毎回コンパイルが走るのですが、キャッシュが効いていないのでしょうか?
A. まったく同じ撮影設定(解像度倍率・HDR・マスクなど)であれば、2回目以降は原則コンパイルされません。毎回走る場合は、撮影ごとに設定が変わっていないか、起動やクリーンのたびにDDCが消えていないかを確認してください。設定が毎回違うと、その都度「別の順列」が必要になります。

Q2. シェーダコンパイル自体を速くする方法はありますか?
A. コンパイルはCPUのコア数や速度に依存するため高性能なマシンほど速くなりますが、撮影体感の改善としては「速くする」より「本番の前にウォームアップ撮影で済ませておく」方が確実です。コンパイル高速化系のコンソール変数はバージョンや環境で挙動が異なるため、利用する場合は公式ドキュメントの確認を推奨します。

Q3. 解像度倍率を上げるほどコンパイルが増えるのですか?
A. 倍率そのものよりも、「その設定の組み合わせで初めて描画経路を通ること」がコンパイルの引き金です。高い倍率やHDR/マスクを初めて使うと新規順列が必要になりますが、一度その設定で撮ってDDCに残れば、同条件での再撮影は待たされにくくなります。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. 床の上に乗ったらイベントを発生させる方法
  2. OverlapAllDynamicとOverlapAllの違い
  3. タイトル画面を作る方法
  4. サードパーソンテンプレートでのキャラクター表示の仕組みと非表示にする方法
  5. ボタンに文字を記載する方法
  6. Event ActorBeginOverlapとOn Component Begin Overlapの違い
  7. キャラクターに特定のオブジェクトとの当たり判定を付ける
  8. 特定のオブジェクトに触れたとき、キャラクターが倒れるようにする
  9. 動いているオブジェクトに静止しているキャラクターが当たり判定を持たない原因と解決方法
  10. 「On Component Hit」に「Cast To ~」で複数のクラスを指定する方法
  11. Blenderファイルをインポートする方法
  12. 鏡を作成する方法
  13. レベルブループリントでキャラクターの出現を設定する方法
  14. サードパーソンテンプレートにおけるキャラクター出現の定義
  15. アイテムに近づいたらボタンを押してイベントを発火させる方法
  16. 画面の中央にメッセージを表示する方法
  17. どこからでも呼び出せるカスタムイベントを作成する方法
  18. カスタムイベントに引数を追加する方法
  19. 「Get Overlapping Actors」から特定のクラスの場合のみ処理を実行する方法
  20. オブジェクトに近づいている間だけメッセージを表示する方法
  21. PCの画面を操作するUIを作る方法
  22. コンテンツブラウザに画像を追加する方法
  23. SetInputMode_UIOnlyを取り消す方法
  24. 特定の画像の上にマウスカーソルを置いたら手マークにする方法
  25. オブジェクトがアウトライナーで選択できない原因と解決策
  26. PlayerStartを作成する方法
  27. メニュー画面を作成して開く方法
  28. 「Esc」キーを押してメニュー画面を開く方法
  29. イベントの「On Clicked」と「On Pressed」の違い
  30. 「Set Input Mode」の種類と使い方
  31. 「Set Game Paused」の使い方と詳細解説
  32. Motion Matchingとは?
  33. 「GameMode」と「GameModeBase」の違い
  34. マップに配置したTargetPointを取得する方法
  35. TargetPointにタグをつけて取得する方法
  36. Spawnしたインスタンスがイベントを実行する方法
  37. 特定の時間ごとに処理を実行する方法
  38. 数値をランダムで出力する方法
  39. ThirdPersonテンプレートでキャラクターの移動を歩くように変更する方法
  40. MaxWalkSpeedを変更する方法
  41. しゃがむ動作を導入する方法
  42. キャラクターのアニメーションを設定する方法
  43. 導入済みのプラグインを確認する方法
  44. Motion Matchingの導入と必要なプラグイン
  45. プレイヤーを非表示にする方法
  46. カメラを傾ける角度を制限させる方法
  47. 配列からランダムに重ならない要素を特定の数取得する方法
  48. カメラの映す画面に文字やエフェクトを付ける方法
  49. キャラクターやメッシュを非表示にした際にカメラが移動しなくなる問題の解決方法
  50. プライマリーデータアセットを活用する方法
  51. プレイヤーのHPといった変数を定義する最適な場所
  52. カメラに映った画面をスクリーンショットとして保存する方法
  53. ゲーム内のカメラ映像を保存して再表示する方法
  54. HighResShot を使って高解像度の画像を保存する方法(UE5)
  55. HighResShotで保存した画像のファイル名を取得する方法
  56. SceneCapture2DとFrameGrabberの画像保存方法の比較
  57. SceneCapture2Dを使用して画像を保存・取得する方法
  58. HighResShotとTake High Res Screenshotの違い
  59. ゲーム終了ボタンを作成する方法
  60. 「Save Game To Slot」の戻り値がfalseになる問題の解決方法
  61. 画面上にメッセージを指定された時間表示させる方法
  62. シェーダコンパイル時間を短縮する方法
  63. 「Take High Res Screenshot」実行時に「シェーダをコンパイル」に長時間待たされる問題とその解決策
  64. データベースを活用する方法
  65. UE5.5がインストールされた環境にUE5.4を追加で導入する方法
  66. World PartitionとWorld Compositionの違い
  67. オープンワールドテンプレートとは?
  68. ポーンをスポーンさせても視点を切り替えない方法
  69. キャラクター同士がすり抜けてしまう問題の解決方法
  70. キャラクターの外見を動的に変更
  71. World Partitionでインスタンスが「アンロード済み」になる問題
  72. データ アセットとデータ テーブルの違い
  73. コンポーネントイベントグラフ内で親クラスの変数にアクセスする方
  74. エディターのソースコードの自動保存の頻度を高める方法
  75. SpawnActorでSpawn Transform Rotationが反映されない理由
  76. ミニマップを表示しポーンの位置を反映する方法
  77. RInterp ToとVInterp Toの違い
  78. 毎秒実行するイベントの定義方法
  79. Niagara のエフェクトにコリジョンを持たせる方法
  80. 「Overlap」と「Hit」の違い
  81. OverlapはあるがHitがない原因
  82. Overlapした位置の座標を取得する方法
  83. ブループリントでレベル間のパラメータを受け渡す方法

最近更新/作成されたページ