Unreal Engine では、デバイス プロファイルとスケーラビリティ設定を使用して、ハードウェアごとにレンダリング設定をカスタマイズします。 スケーラビリティ設定では、シャドウ、フォリッジ、メッシュの詳細など、個々の機能の品質レベルを定義し、さまざまな設定を 1 つの簡単にスケーリングできる値にまとめます。 そして、デバイス プロファイルで、適合するデバイスにそれらの設定をマッピングします。
Android には、特定の GPU ファミリー に対応した多数のプロファイルがあります。 このガイドでは、デバイス照合ルール、ルールの編集方法、スケーラビリティ設定を操作してゲーム固有のニーズに合ったプロファイルを作成する方法について説明します。
構成と優先順位
Unreal Engine の構成は、エンジンのインストール ディレクトリとプロジェクト フォルダの両方から読み取られます。 「Engine/Config」フォルダは、エンジンの基本的な構成設定です。 その後は、次の順序で互いにオーバーライドします。
Engine/Config/Base*.iniProject/Config/Base*.iniEngine/Config/Android/Android*.iniProject/Config/Android/Android*.ini
たとえば、「Engine/Config/Android」にある「AndroidDeviceProfiles.ini」ファイルは、「Engine/Config」および「Project/Config」の両方で、「BaseDeviceProfiles.ini」よりも優先されます。 また、「Project/Config/Android」にある「AndroidDeviceProfiles.ini」は、上記のすべてよりも優先されます。
Android デバイス プロファイル
標準的な Android デバイス プロファイルには、Android_Low、Android_Mid、および Android_High があります。 Android_High プロファイルは最上位の Android デバイスで Unreal Engine がサポートする全機能を表し、Android_Low は最上位の Android デバイスの最小機能セットを表します。
また、同じ GPU を搭載したモバイル デバイスは通常、同様のパフォーマンス特性があるため、Unreal Engine がサポートする GPU ファミリーに基づいて、より具体的なデバイス プロファイルを分類することもできます。 これらの GPU 固有のデバイス プロファイルは、通常、標準プロファイルの 1 つ (Android_Highなど) を特定のデバイスにマップしますが、特殊なケースの微調整が必要な場合もあります。
たとえば、Unreal Engine 4.24 の Adreno 5xx デバイス向けのデバイス プロファイルは次のとおりです。
[Android_Adreno5xx DeviceProfile]
DeviceType=Android
BaseProfileName=Android_High
+CVars=r.DisjointTimerQueries=1
[Android_Adreno5xx_No_Vulkan DeviceProfile]
DeviceType=Android
BaseProfileName=Android_Adreno5xx;
There are several issues (vulkan sub-passes, occlusion queries) on devices running Android 7 and earlier
+CVars=r.Android.DisableVulkanSupport=1標準の Android_Adreno5xx デバイス プロファイルは、すべての基本設定で Android_High から継承していますが、rDisjointTimerQueries に対するオーバーライドが 1 つだけあります。 Android_Adreno5xx_No_Vulkan プロファイルは標準の Android_Adreno5xx プロファイルを継承し、旧型の Adreno5xx デバイスの問題に起因する Vulkan レンダラのサポートを無効にする別のオーバーライドを提供します。
ゲームのコンテンツによっては、既存のプロファイルをオーバーライドするか、プロジェクトの「AndroidDeviceProfiles.ini」に新しいプロファイルを提供する必要があります。 必要に応じて、これらの GPU 固有のプロファイルをさらに拡張して、これらの GPU ファミリー内でさらに特定のデバイスを表現したり、以前定義したプロファイルを完全に書き直したりすることができます。
DeviceProfile 一致ルール
Unreal Engine アプリケーションが起動すると、それを実行しているデバイスに関する情報がロードされます。 次にアプリケーションは、これらのパラメータに基づいてデバイスを識別するルールのリストをイテレートします。 これらは、**「BaseDeviceProfiles.ini」** の [/Script/AndroidDeviceProfileSelector.AndroidDeviceProfileMatchingRules] セクションにあります。 アプリケーションは、取得したデバイス情報に一致するルールを見つけると、リストの実行を停止して、そのデバイス プロファイルを使用します。
このリストにおけるエントリの形式は次のとおりです。
+MatchProfile=(Profile="Profile_Name", Match=( ( Rule 1 ), ( Rule 2 ), (...) )ルール自体は、次の形式を取る文字列比較です。
SourceType=[source string], CompareType=[comparison type], MatchString=[string to compare the source string to]SourceType に指定した値に応じて、システムが MatchString を比較するソース文字列が出力されます。
SourceType で有効な値と、対応するソース文字列出力は次のとおりです。
| SourceType 値 | 説明 | 出力例 |
|---|---|---|
| デバイスのモデル番号。 | "Nexus 6" |
| デバイスの製造元。 | "NVidia" |
| このデバイスの GPU の GPU ファミリー。 | "Adreno (TM) 320"、"NVIDIA Tegra" |
| このデバイスが実行している OpenGL のバージョン。 | OpenGL ES 3 |
| このデバイスで使用されている Android オペレーティング システムのバージョン。 | 任意の値。 |
| アプリケーションが Vulkan を有効にしてパッケージ化されているか、そしてデバイスがプロジェクト設定で指定された必須バージョンの Vulkan をサポートしているかどうかをチェックします。 | Vulkan が利用できない場合は |
| このデバイスで使用されている Vulkan のバージョン (利用可能な場合)。 | 任意の値。 |
| 同じ MatchProfile エントリ内にある以前の正規表現一致の値。 | 正規表現一致によって以前に出力された情報。 |
次の比較タイプを使用できます。
| 比較タイプ | 説明 |
|---|---|
| MatchString で正規表現演算子を使用して比較を実行します。 |
| 2 つの文字列の値が完全に同じであることを確認します。 |
|
|
| 2 つの文字列の値が同じでないことを確認します。 |
|
|
| ソース文字列の値が MatchString より小さいかどうかを確認します。 |
|
|
|
|
|
|
| ソース文字列の値が MatchString より大きいかどうかを確認します。 |
|
|
|
|
|
|
例として、4.24 の Mali T8xx デバイスのエントリを次に示します。
+MatchProfile=(Profile="Android_Mali_T8xx_No_Vulkan",Match=((SourceType=SRC_GpuFamily,CompareType=CMP_Regex,MatchString="^Mali\\-T8"),(SourceType=SRC_AndroidVersion, CompareType=CMP_Regex,MatchString="([0-9]+).*"),(SourceType=SRC_PreviousRegexMatch,CompareType=CMP_Less,MatchString="8")))この MatchProfile エントリには次の 3 つのルールがあります。
GPU ファミリーには、文字列「^Mali-T8」を含む正規表現の一致が必要です。
Android バージョンには 1 桁以上の数字が含まれている必要があります。数字は数字以外の文字が見つかるまで記憶されます。
2 番目のルールから取得される Android バージョンは 8 未満である必要があります。
これらすべての条件が満たされた場合、Android_Mali_T8xx_No_Vulkan プロファイルが使用されます。
デバイス プロファイル ルールは、製造元が最初にリスト出力され、次に最も低い仕様から最も高い仕様まで昇順で表示されます。 どのルールにも適合せず、特定のデバイスが識別できない場合に備えて、標準の Android プロファイルがフォールバックとしてリストに表示されます。
このリストにルールを追加する場合、同じファミリー内の他のデバイスに対して適切な順序で配置されていることを確認してください。
Vulkan を有効にする
VulkanAvailable という特殊なパラメータを使用すると、デバイスが Android Vulkan レンダラを使用できるかどうかを識別できます。 最初に、ゲーム自体で Vulkan サポートが有効かどうかを確認してから、デバイスに Vulkan ドライバがあるかどうかを確認します。 これら 2 つの条件が満たされた場合、VulkanAvailable は true と見なされます。
Vulkan をサポートするデバイスには、ターゲットデバイスで利用可能であるにもかかわらず、Vulkan を使用しないプロジェクトを考慮して、Vulkan が有効である場合とない場合の両方のプロファイルがあります。 すべてのプロファイルには、r.Android.DisableVulkanSupport というパラメータがあります。これは、デフォルトで 1 に設定されています。 Vulkan 対応デバイス プロファイルでは、このパラメータを 0 にオーバーライドします。
Vulkan をサポートする初期のデバイスではドライバに多くのバグがあったため、Vulkan を有効にすることは Android 9 以降を実行しているデバイスのみで推奨されます。
スケーラビリティ設定 (Scalability Settings)
Unreal Engine の基本スケーラビリティ設定は、エンジンのインストール ディレクトリにある「Engine/Config/BaseScalability.ini」で定義されています。 Android デバイスのスケーラビリティ設定は、「Engine/Config/Android/AndroidScalability.ini」で定義されています。
スケーラビリティ値の詳細
スケーラビリティ設定では、幅広いパラメータのセットを受け取り、それらを幅広いカテゴリに集約して、0~3 のシンプルな値で定義します。 たとえば、「BaseScalability.ini」の ShadowQuality レベル 0 のスケーラビリティ マッピングは以下のとおりです。
[ShadowQuality@0]
r.LightFunctionQuality=0
r.ShadowQuality=0
r.Shadow.CSM.MaxCascades=1
r.Shadow.MaxResolution=512
r.Shadow.MaxCSMResolution=512
r.Shadow.RadiusThreshold=0.06
r.Shadow.DistanceScale=0.6
r.Shadow.CSM.TransitionScale=0
r.Shadow.PreShadowResolutionFactor=0.5
リストの各値は非常に固有の機能を表しており、それぞれには独自のスケールがあります。 たとえば、ピクセル解像度に関する処理や、デフォルト値を乗算するスケール係数に関する処理、さらに任意の処理もあります。 これらを機能ごとに定義すると膨大な量になる場合があります。また、ハードウェアは頻繁に更新されるため、リリースの合間に調整する必要があります。
そこで、ShadowQuality を使用して、関連する設定項目のグループを、人間が判読可能な 1 つの値に集約します。 上記のエントリは、構成ファイルで sg.ShadowQuality が「0」に設定されている場合に、これらすべての値がどのように動作するかを定義します。 ShadowQuality@1~3 にも同様のエントリがあります。
これらのデフォルトのスケーラビリティ値のガイドラインは次のとおりです。
| スケーラビリティ値 | 説明 |
|---|---|
0 | 低品質。 Unreal Engine がサポートするハードウェアの最小範囲と互換性がある最低レベルの設定。 |
1 | 中品質。 Unreal Engine でテストされたローエンドデバイスとハイエンドデバイスの中間にある、さまざまなハードウェアに適した設定。 |
2 | 高品質。 Unreal Engine でテストされたほとんどのハイエンド ハードウェアに適した設定。 |
3 | Epic 品質。 Unreal Engine の現在のバージョンでの特定の機能の可能な最大値。 |
スケーラビリティ設定のオーバーライド
スケーラビリティ設定をオーバーライドするには、プロジェクトの独自の「Config」ディレクトリで「AndroidScalability.ini」を作成します。 たとえば、「AndroidQuickStart」というプロジェクトがある場合、「AndroidQuickStart/Config/Android」に作成します。
このファイルで作成されたスケーラビリティ設定は、「Engine/Config/Android/AndroidScalability.ini」で定義されている設定よりも優先順位が高くなります。
デバイス プロファイルでスケーラビリティ値を設定する
デバイス プロファイルでスケーラビリティ値を参照するには、プレフィックス「sg.」を使用し、その後に設定したい値の名前を付けます。 たとえば、デバイス プロファイルで ShadowQuality を「1」に設定する場合、次のようにします。
+CVars=sg.ShadowQuality = 1このスケーラビリティ値の後にリストされる設定は、元の値よりも優先順位が高くなります。 ただし、デバイス プロファイル内部の小規模なパラメータを変更するのではなく、「*Scalability.ini」ファイル内部のスケーラビリティ パラメータを変更し、スケーラビリティ グループを一貫して観察することを強くお勧めします。 これにより、エディタ内のプレビュー レンダリング レベルがモバイル スケーラビリティの値が確実に正確に適用されます。
実行時にスケーラビリティ設定を変更する
デバイス プロファイルによって選択された初期のスケーラビリティ設定は単なるデフォルト設定であり、スケーラビリティはさまざまなメソッドで実行時に簡単に変更できます。
Unreal エディタの [設定] メニューを使用する
テスト目的の場合は、ツールバーの [設定] ドロップダウンをクリックして [エンジンの拡張機能設定] を選択すると、Unreal エディタ内でゲームのスケーラビリティ設定を変更できます。
このメニューで行った変更は、ただちに適用されます。
コンソール コマンドを使用してスケーラビリティ設定を変更する
スケーラビリティ設定は、コンソール コマンド と呼ばれることがあります。 たとえば、コンソールに「sg.FoliageQuality 2」と入力し、Enter キーを押すと、FoliageQuality の下にあるすべての CVar の値が変更されます。
[エンジンの拡張機能設定] メニューの値には、この変更が反映されます。
コンソール コマンドとして数値を指定せず名前を入力することで、スケーラビリティ設定の現在の値を出力することもできます。 たとえば、「sg.FoliageQuality」と入力して Enter キーを押すと、コンソールには、FoliageQuality の現在の値と、その値が最後に設定された場所の両方が出力されます。
ブループリントでスケーラビリティ設定を変更する
ブループリントでコンソール コマンドを使用してスケーラビリティ設定を変更できる一方で、Game ユーザー設定の一部である専用関数を使用することもできます。これにより、Get Game User Settings ノードを使用してリファレンスを取得できます。
この機能を UMG と組み合わせて使用することで、ユーザーがこれらの設定を変更できるメニューをビルドできます。 これにより、ユーザーはゲームのグラフィックスとパフォーマンスを希望どおりにカスタマイズできます。
C++ でスケーラビリティ設定を変更する
C++ では、ゲーム ユーザー設定には、静的関数 UGameUserSettings::GetGameUserSettings を使用してアクセスできます。 その後、専用の get および set 関数を使用して、スケーラビリティ設定で品質レベルを取得および設定できます。
#include "MyActor.h"
#include "GameUserSettings.h"
void AMyActor::SampleScalabilityFunctions()
{
//Getting a reference to the Game User Settings.
UGameUserSettings* UserSettings = UGameUserSettings::GetGameUserSettings();
//Getting the current Foliage Quality.
Int32 FoliageQuality = UserSettings->GetFoliageQuality();