動的解像度

Unreal Engine 4 で使用される動的解像度システムの概要を説明します。

Windows
MacOS
Linux

DynamicRes_FN1.png

動的解像度 は、それまでのフレームの GPU 負荷に応じて primary screen percentage を調整する機能です。解像度はヒューリスティックで (必要に応じて) 調整されます。たとえば、画面上のオブジェクトが多すぎるときや、負荷の高いエフェクトが突然フレームに入ってきたような場合が調整の対象となります。このようなときには、GPU のレンダリング時間が長くなるので、ターゲット フレーム レートを維持するために画面の解像度が下げられます。

動的な解像度の有効化

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

r.DynamicRes.OperationMode

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

  • 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

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

UE4 のデバイス プロファイル ウィンドウを使用してコンフィギュレーション ファイルの設定と管理を行うことができます。このウィンドウには、メニューから [Edit (編集)] - [Developer Tools (デベロッパーツール)] - [Device Profiles (デバイスプロファイル)] の順に選択してアクセスできます。

動的解像度の一時停止と再開

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

r.DynamicRes.OperationMode

説明

0

無効 (デフォルト)

1

GameUserSettings で使われている設定に基づいて有効にします。

2

GameUserSettings で使われている設定に関わらず有効にします。

次の表では、特定の Operation Mode が有効または無効である場合に利用できる状態と、GameUserSettings の影響について説明しています。

Game User Settings = False

Game User Settings = True

一時停止

停止しない

一時停止

停止しない

OperationMode=0

不可

不可

不可

不可

OperationMode=1

不可

不可

不可

OperationMode=2

不可

不可

C++ では、次の関数を使って動的解像度の状態を制御および確認できます。

アクション

C++ の関数

一時停止

GEngine->PauseDynamicResolution();

再開

GEngine->ResumeDynamicResolution();

状態の確認 (有効、無効、一時停止)

GEngine->GetDynamicResolutionStatus();

この表で挙げた C++ の関数による 一時停止再開 の機能は、Set Dynamic Resolution Enabled ブループリントノードを有効または無効にすることで利用できます。状態を確認するには、Is Dynamic Resolution Enabled ノードを使用してください。

統計情報の使用

いくつかの統計情報画面を有効にすると、動的解像度を使用する際にパフォーマンスについてデバッグできます。有効にするには、backtick (`) キー(日本語環境では@ キー)を押してコンソールを開き、次のいずれかのコマンドを入力します。

  • Stat Unit は、全体的なフレーム時間、ゲーム スレッド、レンダリング スレッド、GPU 時間を表示するために使用します。

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

  • Stat Raw を使うと、フィルタリングされていないデータを Stat UnitGraph で出力できます。

Stat Unit

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

DynResOFF.png

有効になっている場合、DynRes: の行には Primary Screen PercentageSecondary Screen Percentage が表示されます。

DynResON.png

ここでは primary screen percentage が表示されています。X 方向と Y 方向について比率が表示されているので、両方の軸でスケールされることがわかるようになっています。GPU が描画するピクセルの数は、 画面パーセント x 画面パーセント に比例します。

1920x1080 や 1280x720 などが例として挙げられます。

Stat UnitGraph と Stat Raw

Stat UnitGraph を呼び出すと、グラフが描画され、動的解像度によって選択された Primary Screen Percentage を表示します。

StatUnitGraph.png

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

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

  3. 動的解像度の最大の画面パーセント

  4. 動的な primary screen percentage の推移の曲線

UnitGraph では動的解像度によって選択された primary screen percentage を表示できます。ただし、曲線は、画面パーセント x 画面パーセントに基づいて GPU で描画されるピクセルの数に比例したものになります。

また、UnitGraph では、フィルタリングしていない (未加工の) タイミングを取得することもできます。そのためには Stat Raw を使用してフィルタの適用の有無を切り替えます。グラフのタイミングのラベルが変化して、未加工のタイミングを表示していることを示します。

未加工のタイミング

フィルタ済みのタイミング

タイミングへのフィルタの適用の有無を切り替えるには、コンソール ウィンドウを使用します。Stat UnitGraph を入力すると Stat Raw を切り替えられるようになります。

動的解像度による安定化

UE4 での動的解像度の実装はそれまでに使われていたものとはやや異なり、解像度が特定のもの (1080p、900p、720p) に制約されることなく、一定の範囲内で必要に応じて変化できます。この例のグラフでは、コンソール変数が何を制御するかを示しています。動的解像度は、問題がない状況では解像度を一定の範囲内で自動的に調整 (図の 3 を参照) し、フレームへの割り当て時間を超過しないようにします。これは航空機の高度のようなものだと考えられます。航空機は目的地に向けて理想的なスピードで進むようにしながら、高度を一定の範囲内で自由に変化させます。動的解像度では同様に、必要に応じて解像度を上下させつつ、解像度とパフォーマンスの間で適切なバランスを維持します。

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

FrameGPUGraph.png

参照番号

コンソール変数

説明

1

r.DynamicRes.FrameTimeBudget

フレームの時間割り当て (ミリ秒単位)。

2

r.DynamicRes.TargetedGPUHeadRoom

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

3

r.DynamicRes.ChangePercentageThreshold

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

4

r.DynamicRes.MinResolutionChangePeriod

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

また、次のコンソール変数を使用すると、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. レンダリングの負荷が高い視覚効果が発生し、フレームへの割り当てを 3 フレーム以上にわたって超過します。

  2. 動的解像度がすばやく対応し、解像度を低下させてから通常の状態へと徐々に戻します。

さまざまな primary screen percentage でのコンテンツのテスト

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

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

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

Editor Screen Percentage: | 100 (default)

Editor Screen Percentage: | 50

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

Editor_ScreenPercentageIndicator.png

Screen Percentage の値をデフォルトより高くすると、Editor でパフォーマンスが低下したり反応が悪くなったりすることがあります。このような問題が発生した場合は、Screen Percentage の値をデフォルトの 100 にリセットしてみてください。

サポート対象プラットフォーム

現在、Xbox One、PlayStation 4 (PSVR を除く)、Nintendo Switch、Oculus VR が動的解像度をサポートしています。Unreal Engine の将来のバージョンで、サポート対象プラットフォームを追加する予定です。

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

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

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

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

GEngine->ChangeDynamicResolutionStateNextFrame(new FMyGameSpecificDynamicResolutionState());

画面パーセントに関するあらゆる計算において 100 で割るということを避けるために、レンダラは、ResolutionFraction を使用します。「scale (スケール)」ではなく fraction (比) という名前になっているのは、TAA アップサンプルや spatial upscale によって行われるアップスケールの比率の計算は、実際には、次に挙げるように 1 を Resolution Fraction で割った形で表されるためです。

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

制限事項

現在の動的解像度にはいくつか制限事項があります。

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

  • TAAU が有効になっている場合、動的解像度は VR で動作します。マルチサンプル アンチエイリアシング (MSAA) は将来のリリースでサポートする予定です。

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

  • Gaussian Depth of Field (DoF) と Distance Field Ambient Occlusion (DFAO) には、解像度の変更に関連する問題があります。

よくある質問 (FAQ)

動的解像度に関するよくある質問をいくつか次に挙げます。

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

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

動的解像度は任意の secondary screen percentage で使用できますか?

はい。コンソール変数 r.SecondaryScreenPercentage.GameViewport を使えば可能です。

詳細については、画面パーセントと Temporal Upsample のページをご覧ください。

secondary screen percentage の動的解像度を制御できますか?

いいえ。設計上不可能です。テンポラル アンチエイリアシングの履歴のサイズを変更することは望ましくありません。secondary screen percentage を動的に変更する必要があるべきではないのはそのためです。

なぜ FPostProcessSettings の画面パーセント向け関数は動的解像度で無視されるのですか?

以前の仕組みでは、ポスト プロセス ボリュームの設定で画面パーセントを設定して、手動でスケール アップまたはスケール ダウンできました。動的解像度を使用すると、GPU の負荷に応じて自動的に処理が行われるので、その設定は不要になります。

なぜ Editor での動的解像度の表示フラグのオプションがないのですか?

グローバルに行われる処理で、ゲーム スレッドによって判断されるものだからです。画面パーセントの表示フラグは、Primary Screen Percentage のみを切り替えます。

なぜ動的解像度は Editor のビューポートでサポートされないのですか?

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

primary screen percentage と secondary screen percentage にマテリアルでアクセスできますか?

いいえ。マテリアルは解像度とは独立してレンダリングされます。

Select Skin
Light
Dark

新しい Unreal Engine 4 ドキュメントサイトへようこそ!

あなたの声を私たちに伝えるフィードバックシステムを含め、様々な新機能について開発をおこなっています。まだ広く使える状態にはなっていないので、準備ができるまでは、ドキュメントフィードバックフォーラムで、このページについて、もしくは遭遇した問題について教えていただけると助かります。

新しいシステムが稼働した際にお知らせします。

フィードバックを送信