動的解像度

スクリーン パーセンテージを動的に調整してパフォーマンスを向上させる方法です。

DynamicRes_FN1.png

Dynamic Resolution (動的解像度) は、1 つ前のフレームの GPU ワークロードに従ってプライマリのスクリーン パーセンテージを調整する機能です。この割合は、画面にオブジェクトが多すぎる場合や、突然フレームに入る高負荷なエフェクトがある場合など、必要に応じてヒューリスティックに基づき調整されます。これを使用すると、GPU レンダリング時間が長くなり、ターゲット フレームレートを維持するために画面の解像度が低下します。

動的解像度を有効にする

ランタイム時の動的解像度を有効にする

動的解像度は、Game User Settings ノードでブール値を取得することで有効にできます。ブループリントまたは C++ を使用している場合に設定可能です。

ブループリント**で、Game User Settings** ノードを使用して次のような機能をオプトインすることにより、動的解像度を有効にできます。

The Game User Settings node in Blueprint provides access to Dynamic Resolution settings.

C++ では、ブール値は UGameUserSettings で次のように設定できます。

    GEngine->GetDynamicResolutionStatus()->SetEnabled(true);

SetEnabledfalse を使用すると無効にできます。

ゲーム スレッド ロジックは、動的解像度を実際に有効または無効にするタイミングを最終的にプログラムで制御します。そのため、ランタイム時にブループリントを使用して有効にすると、そのロジックがコードでの設定よりも優先されます。ゲーム ユーザー設定を元の状態に戻すには、次を使用します。

    GEngine->GameUserSettings->ApplyNonResolutionSettings();

Operation モードで動的解像度を制御する

Operation モード を使用すると、ゲームでどのように動的解像度をオーバーライドして使用するのかを設定できます。この制御には、プロジェクトのプラットフォームごと (Xbox One、PlayStation 4 など) のコンフィギュレーション プロファイル (またはデバイス プロファイル) で、次のコンソール コマンドを使用できます。

    r.DynamicRes.OperationMode

次の値のいずれかを使用して、プロジェクトのプラットフォームでの Operation モードの動作を設定します。

  • 1 の場合、Game User Settings の状態 (C++ またはブループリントで設定します) に基づいて動的解像度を有効にします。

  • 2 の場合、Game User Settings の状態に関係なく動的解像度を有効にします。

次のコンソール変数は、動的解像度を有効にした後、解像度を下げる前に、特定のフレームのスクリーン パーセンテージの最小と最大、および最大割り当て時間を設定します。設定しない場合のデフォルト値は次の通りです。

コンソール変数

デフォルト値

説明

r.DynamicRes.MinScreenPercentage

50

使用する最小のスクリーン パーセンテージを設定します。

r.DynamicRes.MaxScreenPercentage

100

レンダー ターゲットの割り当てに使用される最大 primary screen percentage を設定します。

r.DynamicRes.FrameTimeBudget

33.3

フレームの割り当て時間を設定します (ミリ秒単位)。

Unreal Engine の [Device Profiles (デバイスプロファイル)] ウィンドウで、コンフィギュレーション ファイルをセットアップしたり、それらを管理したりできます。このウィンドウにアクセスするには、ファイル メニューの [Edit (編集)] > [Developer Tools (デベロッパーツール)] > [Device Profiles (デバイス プロファイル)] を選択します。

動的解像度を一時停止する / 再開する

動的解像度をプロジェクトでは有効にして、メイン ロビーのようなところでは無効にする必要がある、といった場面があります。動的解像度は、Operation Mode と一緒に一時停止および再開することができます。次のコンソール変数を使用して、動的解像度の Operation モードを設定できます。

    r.DynamicRes.OperationMode

説明

0

無効 (デフォルト)

1

GameUserSettings で使用される設定に基づいて有効になります。

2

GameUserSettings で使用される設定に関係なく有効になります。

以下の表は、特定の Operation モードが有効または無効になっているときに使用できるさまざまな状態と、それらの状態が GameUserSettings に対してどのような影響を与えるかを説明しています。

Game User Settings = False

Game User Settings = True

一時停止

一時停止しない

一時停止

一時停止しない

OperationMode=0

OperationMode=1

OperationMode=2

C++ では、次の関数を使用して、動的解像度のステータスを制御および確認できます。

操作

C++ 関数

一時停止

GEngine->PauseDynamicResolution();

再開

GEngine->ResumeDynamicResolution();

ステータスの確認 (無効、有効、一時停止)

GEngine->GetDynamicResolutionStatus();

ブループリントでは、Set Dynamic Resolution Enabled ノードの有効化または無効化を行うことで、C++ 関数によって提供されている、この表の 一時停止 および 再開 機能を実行できます。ステータスを確認するには、Is Dynamic Resolution Enabled ノードを使用します。

動的解像度に統計を使用する

動的解像度のパフォーマンスのデバッグに使用できる統計がいくつかあり、画面上に表示できます。それらを有効にするには、バックティック (`) キーを使用してコンソールを開き、次のコマンドのいずれかを入力します。

  • Stat Unit は、全体のフレーム時間、ゲーム スレッド、レンダリング スレッド、および GPU 時間の確認に使用します。

  • Stat UnitGraph は、Stat Unit データを含むグラフの表示に使用します。

  • Stat Raw は、Stat UnitGraph を使用してフィルタリングされていないデータを出力します。

Stat Unit

Stat Unit を呼び出すと、DynRes 行を参照することで、シーンで動的解像度が有効になっているかどうかをすぐに確認できます。

DynResOFF.png

有効にすると、DynRes ラベルには、プライマリ スクリーン パーセンテージセカンダリ スクリーン パーセンテージ が次のように表示されます。

DynResON.png

X と Y のプライマリ スクリーン パーセンテージがここに表示されるため、両方の軸でスケーリングされていることをいつでも確認できます。GPU によって描画されるピクセル数は、実際には**スクリーン パーセンテージ x スクリーン パーセンテージ**に比例します。

例は 1920x1080 または 1280x720 です。

Stat UnitGraph および Stat Raw

Stat UnitGraph が呼び出されると、動的解像度によって選択された プライマリ スクリーン パーセンテージ を示すグラフが描画されます。

StatUnitGraph.png

  1. タイミング (フィルター済みまたは未加工)

  2. ターゲットフレーム時間のしきい値

  3. 動的解像度の最大スクリーン パーセンテージ

  4. 動的なプライマリ スクリーン パーセンテージの曲線

UnitGraph は、動的解像度によって選択されたプライマリ スクリーン パーセンテージを表示できます。ただしその曲線は、スクリーン パーセンテージ x スクリーン パーセンテージに基づき GPU によって描画されるピクセルの量に比例します。

さらに、Stat Raw を使用してフィルター処理とフィルター処理なしを切り替えることにより、UnitGraph でフィルター処理されていない (未処理の) タイミングを取得できます。グラフのタイミング ラベルが変更され、未処理時のタイミングが表示されていることを示します。

未処理時のタイミング

フィルター処理されたタイミング

コンソール ウィンドウを使用して、フィルター処理されたタイミングとフィルター処理されていないタイミングを切り替えることができます。Stat Raw を切り替える前に、Stat UnitGraph を最初に入力する必要があります。

動的解像度のクルージング

Unreal Engine での動的解像度の実装は、単一の解像度 (1080p、900p、720p) に制限されるのではなく、指定された範囲内で必要に応じて解像度を変更できることから、従来使用されてきた他の動的解像度とは少し異なります。このグラフの例では、このモデルはコンソール変数が制御するものを示しています。これは、すべてが特定のフレームの割り当てを超えずに正常に動作しているときに、動的解像度が特定の範囲内 (3) でどのように自動的に調整するのかを示しています。これは飛行機の巡航高度の範囲を表しており、この範囲内では、飛行機が目的地に到達するための理想的な速度を得られるものと考えてください。解像度は、解像度と適切なパフォーマンスの適切なバランスを維持するために必要に応じて上下することで、飛行機と同じことを行います。

このモデルはデモ目的のもので、あるシーンで起きていることすべてを考慮したものではありません。たとえば、CPU と同期されていない GPU の状態や、ヒューリスティックによる解像度の変更量を正しく推測しているかどうかさえもキャプチャしません。このモデルの目的は、理想的な状況についてわかりやすく示すことで、動的解像度のコンソール変数の仕組みを紹介することにあります。

FrameGPUGraph.png

参照番号

コンソール変数

説明

1

r.DynamicRes.FrameTimeBudget

ミリ秒 (ms) でのフレームの時間割り当てです。

2

r.DynamicRes.TargetedGPUHeadRoom

割り当てを超過しない範囲で GPU に残された余裕です (割り当てに対する割合で表示)。これは出荷プラットフォームや有効になっているレンダリング機能によって左右されます。たとえば、モーション ブラーを使用するには、カメラのすばやい回転に対応するため余裕を多めに取る必要があります。

3

r.DynamicRes.ChangePercentageThreshold

割り当てのサイズを変更するために最低限必要な変更量を割合で示したものです。解像度を細かく変化させ続けることにならないようにするために便利です。この値が小さすぎると、解像度が変化し続けることになる場合があります。一方で、大きすぎると、GPU の割り当てを超過してしまうリスクが増大します。

4

r.DynamicRes.MinResolutionChangePeriod

解像度の変更を許可するまでに最低限必要なフレーム数です。このコマンドには複数の目的があります。たとえば、測定ノイズがある中で特定のプライマリ スクリーン パーセンテージにおける GPU 使用量のモデルを作成するヒューリスティックの信頼性を向上させるために使用されます。また、フレーム単位のオフセットのジッターの間で発生する可能性がある テンポラル アップサンプル による入力サンプルのオフセットの干渉を回避できるようにするためにも使用されます。あるいは、アンチエイリアスの相違を引き起こす可能性がある解像度を変更する際にも使用されます。

次のコンソール変数を使用して、動的解像度に使用されるヒューリスティックの履歴と、GPU ではなく CPU にバインドされている場合に使用するスクリーン パーセンテージを調整することもできます。

コンソール変数

説明

r.DynamicRes.HistorySize

ヒューリスティックのフレーム履歴のフレーム数です。小さすぎると履歴にノイズが多くなり、ヒューリスティックの信頼性が低くなります。大きすぎると調整が大幅に遅れてしまう可能性があります。

r.DynamicRes.CPUBoundScreenPercentage

CPU バウンドの場合にターゲットとする primary screen percentage です。CPU と GPU が同じメモリ帯域幅を共有しているプラットフォームでは、スクリーン パーセンテージを低く設定して解像度を下げると使いやすくなります。

割り当て超過時のパニック

カメラのカット内、あるいは負荷が高い視覚エフェクトの使用時などに動的解像度が急に割り当てを超えてしまう場合、使用されるヒューリスティックは実際には何が起きるかを予測できません。このような場合、「パニック」スイッチを使用して、割り当て超過したフレーム数が減少したときに、すぐに解像度を下げることができます。N (何らかの数) フレーム連続で利用可能な GPU タイミングが割り当てを超えていることをヒューリスティックが発見すると、ただちに解像度を適応させてこの問題に対処します。また、履歴を自動的にリセットして、以前の負荷が低かったフレームのタイミングが負荷の高いフレームに対するヒューリスティックに影響を与えないようにします。

次のコンソール コマンドを使用すると、「パニック」スイッチがオンになり解像度が引き下げられるまでに GPU が割り当てを超過できる最大の連続フレーム数を制御できます。

    r.DynamicRes.MaxConsecutiveOverbudgetGPUFrameCount

このグラフでは、フレームでの負荷が急激に増加し、割り当てられた 33.3 ミリ秒を 3 フレーム以上連続で超過します。そして、超過した時点でパニック スイッチが有効になり、解像度をすばやく低下させてフレームの割り当てを超えないようになっています。

OverBudgetPanicGraph.png

  1. 割り当てを超過している最大の連続 GPU フレーム。

  2. GPU がレンダー スレッドと同期しないことによる、検出から解像度の変更までの間におけるフレーム レイテンシー。

  3. パニックの検出によるフレームでのドロップのトリガー。

  4. 特定のフレームでの解像度の変更。

次のキャプチャ (Epic Games Launcher の [Learn (ラーニング)] タブから取得できるインフィルトレーター デモで撮影) では、Stat Raw コマンドを使用して、カメラのカットがあったり、画面で負荷の高い視覚エフェクトが発生したりしたときのシーンの動作をはっきりと特定しています。

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

  1. カメラがカットされた後、少なくとも数フレームの間はフレームのレンダリング負荷が非常に重くなります。

  2. 動的な解像度はパニック反応を起こして解像度がすぐに下がります。その後で再び正常に戻るために徐々に解像度が上がります。

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

  1. レンダリングの負荷が高い視覚エフェクトが発生し、フレームへの割り当てを数フレーム以上にわたって超過するスパイクが発生します。

  2. 解像度を下げると動的解像度がすぐに動作し、その後再び通常の状態へ徐々に戻ります。

さまざまな primary screen percentage でコンテンツをテストする

プロジェクトで動的解像度が有効になっている場合、テストを行って primary screen percentage が低いときに想定と大きくかけ離れた見た目になっていないことを確認する必要があります。低い解像度では、詳細の一部が失われ、アセットの見た目が想定したものを維持できなくなる可能性があります。まさにこの目的のために、すべてのエディタのビューポートで、テスト用のスライダーを使って [Screen Percentage] を設定できるようになっています。

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

スライダーを使用してさまざまなスクリーン パーセンテージをビューポートに適用し、レベルのコンテンツを確認できます。特にアーティストは、このスライダーを使用して、高いものから低いものまでプロジェクトで使われる範囲のスクリーン パーセンテージでコンテンツを確認すると良いでしょう。

エディタのスクリーン パーセンテージ: | 100 (デフォルト)

エディタのスクリーン パーセンテージ: | 50

[Screen Percentage] スライダーを調整したとき、ビューポート (の右下) には、値が「100」より高ければ表示されます。これは、ビューポートの [Screen Percentage] の値がデフォルトから変更されて通常の解像度よりも高くなっているため、パフォーマンスの問題を引き起こす可能性があることを示しています。

Editor_ScreenPercentageIndicator.png

[Screen Percentage] の値がデフォルト値よりも高いと、エディタの動作が遅くなったり、パフォーマンスが低下したりする可能性があります。そうなってしまった場合、値をデフォルトの「100」にリセットしてみてください。

動的解像度がサポートされているプラットフォーム

サポートされていプラットフォームは、以下のとおりです。

  • Microsoftの Xbox One、Xbox Series S、および Xbox Series X

  • PlayStation 4 とPlayStation 5 (PSVR は含まない)

  • Nintendo Switch

サポートされるプラットフォームは、今後のエンジン リリースで追加される予定です。

許可リストに登録されていないプラットフォームで動的解像度を有効にすることは危険で、予期しない結果をもたらす可能性があります。たとえば、GPU のタイミングが誤ったものになって必要がないところで解像度が低下したり、あるいは解像度が上がりすぎてフレームがドロップしたりする可能性があります。それにより、最悪の場合ゲームプレイ体験を台無しにしてしまう可能性があります。デフォルトでは、エンジンで、許可リストに登録されていないプラットフォームで動的解像度を使用することは許可されていません。

C++ で動的解像度のヒューリスティックを置き換える

エンジンが提供するレンダリング スレッドのヒューリスティックは、DynamicResolution.cpp 内で完全に自己完結しています。アーキテクチャは、ゲーム コードのプラグインによってヒューリスティックを完全に置き換えることができるように設定されています。

たとえば、プロジェクトでデフォルトのヒューリスティックを置き換えて、次のフレームで何が起きるかゲーム プレイのコードがヒントを示せるようにする必要がある場合、ヒューリスティックを書き換えてそれを実現できます。IDynamicResolutionState および ISceneViewFamilyScreenPercentage を実装することにより、次の例のようにデフォルトの動的解像度の状態を置き換えることができます。

    GEngine->ChangeDynamicResolutionStateNextFrame(new FMyGameSpecificDynamicResolutionState());

スクリーン パーセンテージに関するあらゆる計算で 100 で割るということを避けるために、レンダラは ResolutionFraction と連携するようになりました。これは、「Scale (スケール)」ではなく fraction (比) と名付けられています。なぜなら、次のようにアップスケール率は TAA アップサンプルによって行われるか、空間アップスケールは実際には 1 を解像度の分数で割ったものであるためです。

    Resolution Fraction = Screen Percentage/100 = 1/Upscaling Factor

動的解像度の制限事項

以下は、動的解像度の現在の制限事項です。

  • 設計上、複数のワールドがある場合に Play-In-Editor での使用はサポートされていません。

  • TAAU を有効にすると、VR で動作します。マルチサンプル アンチエイリアス (Multi-Sample Anti-Aliasing: MSAA) は、今後のリリースでサポートされる予定です。

  • API はモバイル レンダラと完全な互換性があります。ただし、ビューのサイズが primary screen percentage の上限で設定されるレンダラのターゲット バッファ サイズと同じにならないようにするための対策は行われていません。

  • ガウス被写界深度 (DOF) および Distance Field Ambient Occlusion (ディスタンス フィールド アンビエントオクルージョン) (DFAO) には、解像度の変更に関する問題があります。

よくある質問 (FAQ)

以下は、動的解像度に関する一般的なよくある質問です。

動的解像度のヒューリスティックを置き換えることはできますか?

置き換えられます。モジュール式に設計されていて、C++ でプラグインを作成できます。Unreal Engine は単一のヒューリスティックのみ保持しますが、そのアーキテクチャでは、ゲームプレイ コードまたはシーケンサーによってトリガーできるカスタム ゲーム スレッド イベントを使用してスタンドアローンのカスタム ヒューリスティックを作成できます。

動的解像度は、任意の secondary screen percentage で機能しますか?

機能します。機能させるには、コンソール変数 r.SecondaryScreenPercentage.GameViewport を使用してください。

追加情報については、「テンポラル アップスケールによるスクリーン パーセンテージ」のページを参照してください。

secondary screen percentage の動的解像度を制御することは可能ですか?

設計上できません。テンポラル アンチエイリアシングの履歴のサイズ変更はしない方が良いでしょう。secondary screen percentage を動的に変更すべきでないのはこうした理由です。

ScreenPercentage の FPostProcessSettings の関数が動的解像度によって無視されるのはなぜですか?

以前の仕組みでは、ポストプロセス ボリュームの設定でスクリーン パーセンテージを設定して、手動でスケール アップまたはスケール ダウンできました。しかし、動的解像度を使用すると GPU の負荷に応じて自動的に処理されるため、これを設定する必要がなくなったためです。

エディタに動的解像度の表示フラグ オプションがないのはなぜですか?

グローバルに行われる処理で、ゲーム スレッドによって判断されるものだからです。スクリーン パーセンテージの表示フラグは、プライマリ スクリーン パーセンテージ のみを切り替えます。

エディタ ビューポートで動的解像度がサポートされていないのはなぜですか?

現在、動的解像度は、PIE を使用しない Xbox One、PlayStation 4、および Nintendo Switch でのみサポートされています。プラットフォーム (Vulkan、D3D12) で利用可能な場合は、エディタ内で PIE と使用できるようになります。

マテリアルで Primary Screen Percentage と Secondary Screen Percentage にアクセスできますか?

できません。マテリアルは解像度とは独立してレンダリングする必要があります。

Unreal Engine のドキュメントを改善するために協力をお願いします!どのような改善を望んでいるかご意見をお聞かせください。
調査に参加する
キャンセル