Unreal Engine verwendet Geräteprofile und Skalierbarkeitseinstellungen, um die Rendering-Einstellungen für jede Hardware individuell anzupassen. Skalierbarkeitseinstellungen definieren Qualitäts-Levels für einzelne Funktionen wie Schatten, Vegetation und Mesh-Details und fassen ein Array verschiedener Einstellungen zu einem leicht skalierbaren Wert zusammen. Geräteprofile mappen diese Einstellungen dann den Geräten zu, die mit ihnen kompatibel sind.
Android verfügt über ein großes Array an Profilen, die auf bestimmte GPU Familien abgestimmt sind. In diesem Leitfaden werden die Geräte-Match-Regeln erläutert, wie Sie diese bearbeiten können und wie Sie mit Skalierbarkeitseinstellungen arbeiten können, um Profile zu erstellen, die den spezifischen Anforderungen Ihres Spiels entsprechen.
Konfigurationen und Prioritätsreihenfolge
Konfigurationen in Unreal Engine werden sowohl aus dem Installationsverzeichnis Ihrer Engine als auch aus Ihrem Projektordner gelesen. Der Ordner Engine/Konfiguration enthält die grundlegenden Konfigurationseinstellungen für die Engine. Danach überschreiben sie sich gegenseitig in der folgenden Reihenfolge:
Engine/Config/Base*.iniProject/Config/Base*.iniEngine/Config/Android/Android*.iniProject/Config/Android/Android*.ini
Beispielsweise hat die Datei AndroidDeviceProfiles.ini im Verzeichnis Engine/Config/Android Vorrang vor BaseDeviceProfiles.ini sowie für Engine/Config als auch Projekt/Config. Die AndroidDeviceProfiles.ini in Projekt/Config/Android hat Vorrang vor allen oben Genannten.
Profile für Android-Geräte
Die Standardprofile für Android-Geräte sind Android_Low, Android_Mid und Android_High. Das Profil Android_High umfasst alle Funktionen, die Unreal Engine auf den leistungsstärksten Android-Geräten unterstützt, während Android_Low die Mindestfunktionen für die leistungsschwächsten Android-Geräte umfasst.
Wir kategorisieren auch spezifischere Geräteprofile basierend auf den von Unreal Engine unterstützten GPU-Familien, da mobile Geräte mit derselben GPU in der Regel ähnliche Performance-Merkmale aufweisen. Diese GPU-spezifischen Geräteprofile ordnen in der Regel eines der Standardprofile (wie Android_High) bestimmten Geräten zu, müssen jedoch gelegentlich spezielle Tweaks vornehmen.
Beispielsweise gelten die folgenden Geräteprofile für Adreno 5xx-Geräte in Unreal Engine 4.24:
[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=1Das Standard-Geräteprofil Android_Adreno5xx übernimmt alle Grundeinstellungen von Android_High, mit nur einer Überschreibung für rDisjointTimerQueries. Das Profil Android_Adreno5xx_No_Vulkan übernimmt dann vom Standardprofil Android_Adreno5xx und bietet eine weitere Überschreibung, die die Unterstützung für den Vulkan-Renderer aufgrund von Problemen auf älteren Adreno5xx Geräten deaktiviert.
Je nach Inhalt Ihres Spiels müssen Sie möglicherweise vorhandene Profile überschreiben oder neue Profile in der Datei AndroidDeviceProfiles.ini Ihres Projekts bereitstellen. Bei Bedarf können Sie diese GPU-spezifischen Profile weiter ausbauen, um noch spezifischere Geräte innerhalb dieser GPU-Familien darzustellen, oder Sie können zuvor definierte Profile vollständig umschreiben.
Regeln für die Geräteprofilabgleichung
Wenn eine Unreal Engine-Anwendung gestartet wird, lädt sie Informationen über das Gerät, auf dem sie ausgeführt wird. Die Anwendung durchläuft dann eine Liste von Regeln, die Geräte anhand dieser Parameter identifizieren. Diese finden Sie in der Datei BaseDeviceProfiles.ini unter dem Abschnitt [/Script/AndroidDeviceProfileSelector.AndroidDeviceProfileMatchingRules]. Wenn die Anwendung eine Regel findet, die mit den abgerufenen Geräteinformationen übereinstimmt, bricht sie die Suche in der Liste ab und verwendet dieses Geräteprofil.
Das Format für einen Eintrag in dieser Liste lautet wie folgt:
+MatchProfile=(Profile="Profile_Name", Match=( ( Rule 1 ), ( Rule 2 ), (...) )Die Regeln selbst sind String-Vergleiche im folgenden Format:
SourceType=[source string], CompareType=[comparison type], MatchString=[string to compare the source string to]Je nachdem, welchen Wert Sie für SourceType angeben, wird eine Quell-String ausgegeben, die das System dann mit MatchString vergleicht.
Die für SourceType gültigen Werte und die entsprechenden Quell-String-Outputs lauten wie folgt:
| SourceType-Wert | Beschreibung | Beispiel-Output |
|---|---|---|
| Die Modellnummer des Geräts. | „Nexus 6“ |
| Der Hersteller des Geräts. | „NVidia“ |
| Die GPU Familie der GPU in diesem Gerät. | „Adreno (TM) 320“, „NVIDIA Tegra“ |
| Die OpenGL Version, die dieses Gerät ausführt. | OpenGL ES 3 |
| Die Version des Android-Betriebssystems, die von diesem Gerät verwendet wird. | Jeder numerische Wert. |
| Überprüft, ob die Anwendung mit aktiviertem Vulkan verpackt wurde und ob das Gerät die in Ihren Projekt-Einstellungen angegebene erforderliche Version von Vulkan unterstützt. |
|
| Die Version von Vulkan, die dieses Gerät verwendet, sofern verfügbar. | Jeder numerische Wert. |
| Der Wert einer vorherigen Regex-Match innerhalb desselben MatchProfile-Eintrags. | Sämtliche Informationen, die zuvor von einem Regex-Match ausgegeben wurden. |
Die folgenden Vergleichstypen stehen zur Verfügung:
| Vergleichstyp | Beschreibung |
|---|---|
| Führt einen Vergleich durch, der Regex-Operatoren in MatchString verwendet. |
| Überprüfen Sie, ob die Werte der beiden Strings genau übereinstimmen. |
| Wie |
| Überprüfen Sie, ob die Werte der beiden Strings nicht identisch sind. |
| Wie |
| Überprüft, ob der numerische Wert der Quell-Strings kleiner als der MatchString ist. |
| Wie |
| Wie |
| Wie |
| Überprüft, ob der numerische Wert des Quelle-Strings größer als der MatchString ist. |
| Wie |
| Wie |
| Wie |
Als Beispiel wird im Folgenden ein Eintrag für Mali T8xx-Geräte in 4.24 aufgeführt:
+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")))Dieser MatchProfile-Eintrag hat drei Regeln:
Es muss ein Regex-Match für die GPU-Familie mit dem String „^Mali-T8“ geben.
Die Android-Version muss eine oder mehrere Ziffern enthalten, und die Ziffern werden so lange gespeichert, bis eine nicht-numerische Zeichenfolge gefunden wird.
Die aus der zweiten Regel ermittelte Android-Version muss kleiner als 8 sein.
Wenn alle diese Kriterien erfüllt sind, wird das Profil Android_Mali_T8xx_No_Vulkan verwendet.
Die Geräteprofilregeln werden zunächst nach Hersteller aufgelistet und dann in aufsteigender Reihenfolge von den niedrigsten bis zu den höchsten Spezifikationen. Die Standard-Android-Profile werden als Fallbacks aufgeführt, falls keine der Regeln zutrifft und das jeweilige Gerät nicht identifiziert werden kann.
Wenn Sie dieser Liste Regeln hinzufügen, achten Sie darauf, dass Sie diese in der richtigen Reihenfolge relativ zu anderen Geräten innerhalb derselben Familie platzieren.
Vulkan aktivieren
Ein spezieller Parameter mit dem Namen VulkanAvailable wird verwendet, um festzustellen, ob ein Gerät den Android-Vulkan-Renderer verwenden kann oder nicht. Zunächst wird überprüft, ob das Spiel selbst Vulkan-Unterstützung aktiviert hat, dann wird überprüft, ob das Gerät über Vulkan-Treiber verfügt. Wenn beide Bedingungen erfüllt sind, wird VulkanAvailable als True erachtet.
Geräte, die Vulkan unterstützen, verfügen über Profile mit und ohne aktiviertem Vulkan, um Projekte zu berücksichtigen, die Vulkan nicht verwenden, obwohl es auf dem Zielgerät verfügbar ist. Alle Profile verfügen über einen Parameter mit dem Namen r.Android.DisableVulkanSupport, der standardmäßig auf 1 festgelegt ist. Vulkan-fähige Geräteprofile überschreiben diesen Parameter mit 0.
Die Aktivierung von Vulkan wird nur für Geräte mit Android 9 oder höher empfohlen, da die früheren Geräte mit Vulkan-Unterstützung eine Reihe von Bugs in ihren Treibern aufwiesen.
Skalierbarkeitseinstellungen
Die Basis-Skalierbarkeitseinstellungen von Unreal Engine sind in der Datei Engine/Config/BaseScalability.ini definiert, die sich in Ihrem Engine-Installationsverzeichnis befindet. Die Skalierbarkeitseinstellungen für Android Geräte werden in Engine/Config/Android/AndroidScalability.ini definiert.
Skalierbarkeitswerte verstehen
Skalierbarkeitseinstellungen erfassen umfangreiche Parameter-Sets und fassen diese unter weit gefassten Kategorien zusammen, die dann mit einfachen Werten zwischen 0 und 3 definiert werden können. Dies ist beispielsweise das Skalierbarkeit-Mapping für ShadowQuality-Level 0 in BaseScalability.ini:
[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
Jeder der aufgeführten Werte steht für ganz bestimmte Funktionen und jeder hat seine eigene Skala. Zum Beispiel arbeiten einige mit Pixelauflösung, andere mit einem Skalierungsfaktor, der einen Standardwert multipliziert, und wieder andere sind eher willkürlich. Diese können auf Funktionsbasis schwer zu definieren sein und müssen zwischen den Veröffentlichungen angepasst werden, da die Hardware häufig aktualisiert wird.
Daher verwenden wir ShadowQuality, um eine Gruppe verwandter Einstellungen unter einem einzigen, für Menschen lesbaren Wert zusammenzufassen. Der obige Eintrag definiert, wie alle diese Werte sich verhalten, wenn sg.ShadowQuality in einer Konfigurationsdatei auf 0 festgelegt ist. Ähnliche Einträge existieren für ShadowQuality@1 bis 3.
Die Richtlinien für diese Standardwerte für die Skalierbarkeit lauten wie folgt:
| Skalierbarkeitswert | Beschreibung |
|---|---|
0 | Niedrige Qualität. Die niedrigsten Einstellungen, die mit der Mindestanforderung an die von Unreal Engine unterstützte Hardware kompatibel sind. |
1 | Mittlere Qualität. Einstellungen, die auf einem breiten Spektrum von Hardware zwischen leistungsschwachen und leistungsstärksten Geräten, auf denen Unreal Engine getestet wurde, eine gute Leistung bieten. |
2 | Hohe Qualität. Einstellungen, die auf den meisten High-End-Hardwarekomponenten, auf denen Unreal Engine getestet wurde, eine gute Leistung bieten. |
3 | Epische Qualität. Die höchstmöglichen Werte für eine bestimmte Funktion in der aktuellen Version der Unreal Engine. |
Skalierbarkeitseinstellungen überschreiben
Um die Skalierbarkeitseinstellungen zu überschreiben, können Sie eine Datei mit dem Namen AndroidScalability.ini im Konfigurationsverzeichnis Ihres Projekts erstellen. Wenn Sie beispielsweise ein Projekt mit dem Namen „AndroidQuickStart“ haben, würden Sie es unter AndroidQuickStart/Config/Android ablegen.
Alle in dieser Datei erstellten Skalierbarkeitseinstellungen haben Vorrang vor den in Engine/Config/Android/AndroidScalability.ini definierten Einstellungen.
Festlegen von Skalierbarkeitswerten in Geräteprofilen
Um auf einen Skalierbarkeitswert in Geräteprofilen zu verweisen, verwenden Sie das Präfix sg. gefolgt vom Namen des Wertes, den Sie festlegen möchten. Wenn Sie beispielsweise ShadowQuality in einem Geräteprofil auf 1 setzen möchten, würden Sie Folgendes verwenden:
+CVars=sg.ShadowQuality = 1Alle Einstellungen, die Sie nach diesem Skalierbarkeitswert angeben, haben Vorrang vor dem ursprünglichen Wert. Es wird jedoch dringend empfohlen, die Skalierbarkeitsparameter in Ihren Scalability.ini-Dateien zu ändern und die Skalierbarkeit konsistent zu beobachten, anstatt kleine Parameter in den Geräten zu ändern. Dadurch wird sichergestellt, dass die Option Vorschau-Rendering-Level im Editor die Werte für Mobilgerät-Skalierbarkeit korrekt anwendet.
Ändern der Skalierbarkeitseinstellungen während der Laufzeit
Die anfänglichen Skalierbarkeitseinstellungen, die von einem Geräteprofil ausgewählt werden, sind lediglich die Standardeinstellungen, und die Skalierbarkeit kann während der Laufzeit auf verschiedene Weise leicht geändert werden.
Verwendung des Einstellungsmenüs im Unreal Editor
Zu Testzwecken können Sie die Skalierbarkeitseinstellungen in Ihrem Spiel im Unreal Editor ändern, indem Sie auf das Dropdown-Liste Einstellungen Dropdown-Liste in der Symbolleiste klicken und zu Engine-Skalierbarkeitseinstellungen navigieren.
Alle in diesem Menü vorgenommenen Änderungen werden sofort übernommen.
Ändern der Skalierbarkeitseinstellungen mit Konsolenbefehlen
Sie können auch jede Skalierbarkeitseinstellung als Konsolenbefehl bezeichnen. Wenn Sie beispielsweise sg.FoliageQuality 2 in die Konsole eingeben und die Eingabetaste drücken, wird der Wert aller CVARs unter FoliageQuality entsprechend geändert.
Die Werte im Menü Engine-Skalierbarkeitseinstellungen spiegeln diese Änderung wider.
Sie können auch den aktuellen Wert einer Skalierbarkeitseinstellung ausgeben, indem Sie deren Namen als Konsolenbefehl ohne numerischen Wert eingeben. Wenn Sie beispielsweise sg.FoliageQuality eingeben und die Eingabetaste drücken, gibt die Konsole sowohl den aktuellen Wert von FoliageQuality als auch den letzten Ort aus, an dem er festgelegt wurde.
Ändern der Skalierbarkeitseinstellungen in Blueprint
Sie können die Skalierbarkeitseinstellungen zwar über Blueprint-Konsolenbefehle ändern, sie sind jedoch auch über spezielle Funktionen als Teil der Spielbenutzereinstellungen zugänglich, deren Referenz Sie über den Knoten Spielbenutzereinstellungen abrufen zugreifen können.
Sie können diese Funktion zusammen mit UMG verwenden, um Menüs zu erstellen, in denen Ihre Benutzer diese Einstellungen ändern können. Dadurch können Benutzer die Grafik und Performance eines Spiels nach ihren Wünschen personalisieren.
Skalierbarkeitseinstellungen in C++ ändern
In C++ kann mit der statischen Funktion UGameUserSettings::GetGameUserSettings auf die Spieleinstellungen des Benutzers zugegriffen werden. Sie können dann die speziellen Abruf- und Festlegungs-Funktionen verwenden, um den Qualitäts-Level in den Skalierbarkeitseinstellungen abzurufen und festzulegen.
#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();