Höhere Wiedergabetreue und flüssigere Bildraten mit Adaptive Performance

Wir haben vor Kurzem die GDC 2019 abgeschlossen, wo wir während unserer Keynoteüber Adaptive Performance gesprochen haben. Wir freuen uns, Ihnen mitteilen zu können, dass die Vorschauversion und das mobile Megacity -Beispiel jetzt verfügbar sind, sodass Sie diese Funktion erkunden können. In diesem Blog erfahren Sie mehr über Adaptive Performance und wie Sie es auf Ihre eigenen Projekte anwenden können.
Anders als bei PC- oder Konsolenspielen ist zur Ausnutzung der gesamten Leistungsfähigkeit mobiler Hardware ein feines Gleichgewicht erforderlich, damit die Spiele schön aussehen und flüssig laufen. Wenn Sie die Leistung eines Geräts voll ausnutzen, kann dies die Leistung Ihres Spiels schnell beeinträchtigen, indem die Hardware überlastet wird, was wiederum zu Drosselung, schlechter Akkulaufzeit und inkonsistenter Leistung führt. Angesichts der großen Bandbreite an Low-End- und High-End-Zielgeräten wird dieses Problem für Entwickler noch problematischer.
Heutzutage wenden Entwickler unterschiedliche Taktiken an, um dieses Problem zu lösen. Wir haben im Wesentlichen zwei Ansätze gesehen: Entweder man versucht, sicherzustellen, dass die Spiele auf der gesamten Zielhardware die optimale Leistung erbringen, was zu Einbußen bei der Grafiktreue und der Bildfrequenz führt, oder man versucht, das Verhalten der Hardware vorherzusehen, was wirklich schwierig ist, da es nicht viele Optionen zur genauen Messung von Hardwaretrends gibt.
Adaptive Performance bietet Ihnen eine bessere Möglichkeit, die Temperatur und Leistung Ihrer Spiele auf einem Gerät in Echtzeit zu verwalten. So können Sie die Leistungs- und Qualitätseinstellungen Ihres Spiels proaktiv und spontan anpassen und die Hardware nutzen, ohne das Gerät zu überlasten. Das Ergebnis ist eine vorhersehbare Bildrate und eine Verringerung der Wärmeentwicklung, was längere Spielzeiten und ein deutlich angenehmeres Spielerlebnis ermöglicht und gleichzeitig die Akkulaufzeit verlängert.
Für Entwickler bedeutet dies, dass sie mithilfe neuer Tools neue und tiefere Einblicke in die Hardware erhalten, um ihre Spiele dynamischer und flexibler zu gestalten und ihren Spielern beim Spielen auf Mobilgeräten das reibungsloseste und leistungsstärkste Erlebnis zu bieten. Sie haben damit Kontrolle über Entscheidungen, die normalerweise vom Betriebssystem getroffen werden, z. B. wann mit hohen Taktraten gearbeitet werden soll oder welche Anpassungen vorgenommen werden müssen, um eine Drosselung zu vermeiden.
Wir haben während der GDC 2019 mehrere Vorträge zu dieser Funktion gehalten. Sie können sich die Folien hier ansehen und den Unity GDC Booth Talk – Megacity auf dem Handy anschauen: Wie wir es mit Adaptive Performance optimiert haben, erfahren Sie weiter unten.
Um diese Lösung zu verwirklichen, haben wir eine Partnerschaft mit Samsung geschlossen, dem weltweit größten Hersteller mobiler Android-Geräte. Adaptive Performance basiert auf Samsungs GameSDK und wird zunächst für Samsung Galaxy-Geräte wie das Samsung Galaxy S10 und Galaxy Fold verfügbar sein, später in diesem Jahr folgen dann weitere Samsung Galaxy-Geräte.
Diese Diagramme (gezeigt während unserer Unity Keynote auf der GDC 2019) veranschaulichen, wie Adaptive Performance dabei hilft, eine konstant hohe Bildrate zu erzielen, wenn Megacity auf dem neuen Samsung Galaxy S10 läuft.

In Rot sehen Sie die Bildrate in Megacity, bevor wir Adaptive Performance hinzugefügt haben; und in Blau sehen Sie die Ergebnisse, nachdem wir Adaptive Performance hinzugefügt haben. Mit Adaptive Performance läuft die Demo deutlich länger mit 30 fps und ist wesentlich stabiler.

Megacity ist eine futuristische, interaktive Stadt mit Millionen von Objekten, die zeigt, wie Unity selbst die komplexesten Projekte auf mobiler Hardware der aktuellen Generation ausführen kann. Es zeigt die neuesten Fortschritte in unserem datenorientierten Technologie-Stack (DOTS), dem Namen für alle Projekte unter unserem Banner „Performance by Default“, darunter Entity Component System (ECS), Native Collections, C# Job System und der Burst Compiler. Megacity wurde erstmals auf der Unite Los Angeles 2018 vorgestellt und während der GDC 2019für Desktop veröffentlicht.
Megacity ist das richtige Projekt, um eine Beispielimplementierung von Adaptive Performance zu demonstrieren, da es uns die Flexibilität bietet, das Spiel dynamisch und proaktiv anzupassen, um die Hardware optimal zu nutzen. Adaptive Performance wurde im Hinblick auf Skalierbarkeit entwickelt und funktioniert hervorragend mit den DOTS-Prinzipien, die als Grundlage für Megacity verwendet wurden.
Die mobile Version des Projekts verfügt über 4,5 Millionen Mesh-Renderer, 200.000 Gebäudekomponenten, 100.000 Audioquellen und mehr als 6 Millionen Entitäten – ein idealer Kandidat zur Demonstration der Fähigkeiten von Adaptive Performance.
Nachdem Sie Adaptive Performance über den Unity Package Manager installiert haben, fügt Unity beim Erstellen auf einem Gerät automatisch das Samsung GameSDK-Subsystem zu Ihrem Projekt hinzu. Zur Laufzeit erstellt und startet Unity auf unterstützten Geräten einen Adaptive Performance Manager, der Ihnen Feedback zum thermischen Zustand des mobilen Geräts gibt. Sie können Ereignisse abonnieren oder die Informationen vom Adaptive Performance Manager während der Laufzeit abfragen, um in Echtzeit zu reagieren. Andernfalls werden die Statistiken nur an die Konsole gemeldet.
Sie können beispielsweise die bereitgestellte API verwenden, um Anwendungen zu erstellen, die auf thermische Trends und Ereignisse auf dem Gerät reagieren. Dadurch werden konstante Bildraten über einen längeren Zeitraum hinweg sichergestellt und gleichzeitig eine thermische Drosselung vermieden, sogar bevor die Drosselung beginnt. In der Beispielimplementierung von Adaptive Performance in Megacity haben wir drei verschiedene Möglichkeiten zum Glätten der Bildrate verwendet:
- Indem wir mit moderaten CPU- und GPU-Levels begannen und diese schrittweise erhöhten, um Engpässe zu beseitigen, konnten wir den Energieverbrauch niedrig halten.
- Wenn wir merkten, dass das Gerät kurz vor der Drosselung stand, konnten wir die Qualitätseinstellungen anpassen, um die thermische Belastung zu verringern – und wir entschieden uns, die LOD Stufen zu senken.
- Als wir kurz vor der Drosselung standen, haben wir außerdem die Zielbildrate gesenkt.
- Wenn die Zielbildrate erreicht ist und die Temperatur sinkt, erhöhen wir die LOD Level, steigern die Zielbildrate und senken die CPU- und GPU-Level wieder.
Diese Funktionen sorgen dafür, dass Ihr Spiel mit der Zeit eine flüssigere Leistung erreicht. Indem Sie die Temperaturtrends eines Geräts genau im Auge behalten, können Sie die Leistungseinstellungen im laufenden Betrieb anpassen und so eine Drosselung gänzlich vermeiden.
Laden Sie hierdas mobile Beispielprojekt Megacity herunter, um zu sehen, wie wir das gemacht haben. Für Feedback oder Fragen zu Megacity besuchen Sie bitte diesen Forenthread.
Das Herzstück des Pakets ist der Adaptive Performance Manager, den Unity beim Start erstellt und der Ihnen den einfachen Zugriff und das Abonnieren von Benachrichtigungen zu Temperatur- und Leistungsereignissen ermöglicht. Das folgende Beispiel zeigt, wie Sie mithilfe der Schnittstelle IAdaptivePerformance in der Startfunktion Ihres MonoBehaviour auf den Adaptive Performance Manager zugreifen.
private IAdaptivePerformance ap = null;
void Start()
{
ap = Holder.instance;
}
Unity sendet thermische Ereignisse, wenn sich der thermische Zustand des Geräts ändert. Wichtig sind die Zustände, wenn eine Drosselung unmittelbar bevorsteht und wenn eine Drosselung stattfindet. Im folgenden Beispiel abonnieren Sie ThermalEvents, um Ihren lodBias zu reduzieren oder zu erhöhen, was zur Reduzierung der GPU-Last beiträgt.
using UnityEngine;
using UnityEngine.Mobile.AdaptivePerformance;
öffentliche Klasse AdaptiveLOD: MonoBehaviour
{
private IAdaptivePerformance ap = null;
void Start() {
wenn (Inhaber.Instanz == null)
return;
ap = Holder.instance;
wenn (!ap.aktiv)
return;
QualitySettings.lodBias = 1;
ap.ThermalEvent += OnThermalEvent;
}
void OnThermalEvent(object obj, ThermalEventArgs ev) {
Schalter (ev.warningLevel) {
Fall PerformanceWarningLevel.NoWarning:
QualitySettings.lodBias = 1;
brechen;
Fall PerformanceWarningLevel.ThrottlingImminent:
QualitySettings.lodBias = 0.75f;
brechen;
Fall PerformanceWarningLevel.Throttling:
QualitySettings.lodBias = 0.5f;
brechen;
}
}
}
Beachten Sie, dass eine Reduzierung des lodBias unter einen Wert von 1 in vielen Fällen visuelle Auswirkungen hat und es zum Aufpoppen von LOD Objekten kommen kann. Allerdings ist dies eine einfache Möglichkeit, die Grafiklast zu reduzieren, wenn sie für das Spielerlebnis nicht erforderlich ist. Falls Sie noch detailliertere Entscheidungen treffen möchten, um die Handhabung der Grafik und des Verhaltens Ihres Spiels zu optimieren, sind die Engpassereignisse sehr nützlich.
CPU- und GPU-Leistungsstufen
CPU und GPU eines Mobilgeräts verursachen einen sehr großen Teil seines Stromverbrauchs, insbesondere beim Ausführen eines Spiels. Normalerweise entscheidet das Betriebssystem, welche Taktraten für CPU und GPU verwendet werden.
CPU-Kerne und GPUs sind weniger effizient, wenn sie mit ihrer maximalen Taktfrequenz laufen. Bei hohen Taktraten überhitzt das mobile Gerät leicht und das Betriebssystem drosselt die Frequenz von CPU und GPU, um das Gerät abzukühlen.
Sie können diese Situation vermeiden, indem Sie die maximal zulässigen Taktraten mit diesen Eigenschaften begrenzen:
- IAdaptivePerformance.cpuLevel
- IAdaptivePerformance.gpuLevel
Die Anwendung kann diese Eigenschaften basierend auf ihrem Spezialwissen über die aktuellen Leistungsanforderungen konfigurieren und je nach Szenario entscheiden, ob die Pegel gesenkt oder erhöht werden sollen.
- Hat die Anwendung in den vorherigen Frames die Zielbildrate erreicht?
- Befindet sich die Anwendung in einer In-Game-Szene oder in einem Menü?
- Kommt als nächstes eine heftige Szene?
- Ist ein bevorstehendes Event CPU- oder GPU-lastig?
- Werden Sie Anzeigen schalten, die keine hohen CPU-/GPU-Leistung erfordern?
public void EnterMenu(){
wenn (!ap.aktiv)
return;
// Niedrige CPU- und GPU-Stufe im Menü einstellen
ap.cpuLevel = 0;
ap.gpuLevel = 0;
// Niedrige Ziel FPS festlegen
Application.targetFrameRate = 15;
}
öffentliche void ExitMenu(){
// Höheres CPU- und GPU-Level einstellen, wenn man ins Spiel zurückkehrt
ap.cpuLevel = ap.maxCpuPerformanceLevel;
ap.gpuLevel = ap.maxGpuPerformanceLevel;
}
Im Adaptive Performance Manager können Sie den Empfang von Leistungsengpassereignissen abonnieren, die Sie darüber informieren, ob Ihre Leistung an die GPU, CPU oder die „Framerate“ gebunden ist. Frame-Rate-gebunden bedeutet, dass das Spiel durch Application.targetFrameRate begrenzt ist. In diesem Fall sollte die Anwendung eine Senkung ihrer Leistungsanforderungen in Betracht ziehen.
Im Hintergrund läuft der GPU-Frametime-Treiber, der Engpassentscheidungen steuert und über den Manager abgefragt werden kann. Er überwacht die Hardwarezeit, die die GPU für das letzte Frame benötigt hat. Derzeit wird die CPU-Zeit durch die Summierung der internen Subsysteme von Unity berechnet. Je nach Spiel und Szenario können Sie es je nach Temperaturzustandsänderung unterschiedlich reagieren lassen, wenn das Spiel an die CPU oder GPU gebunden ist.
void OnBottleneckChange(object obj, PerformanceBottleneckChangeEventArgs ev) {
Schalter (ev. Engpass) {
Fall PerformanceBottleneck.TargetFrameRate:
if (ap.cpuLevel > 0) {
ap.cpuLevel--;
}
if (ap.gpuLevel > 0) {
ap.gpuLevel--;
}
brechen;
Fall PerformanceBottleneck.GPU:
if (ap.gpuLevel < ap.maxGpuPerformanceLevel) {
ap.gpuLevel++;
}
brechen;
Fall PerformanceBottleneck.CPU:
if (ap.cpuLevel < ap.maxCpuPerformanceLevel) {
ap.cpuLevel++;
}
brechen;
}
}
Es gibt viele verschiedene Möglichkeiten, Spiele zu optimieren, und die Beispiele oben und in Megacity bieten nur einige Vorschläge dazu. Letztendlich hängt es stark davon ab, was für Ihr Spiel am besten funktioniert. Weitere Informationen finden Sie auch in der Paketdokumentation.
Dies ist erst der Anfang! Wir werden weiterhin in Adaptive Performance investieren, im Laufe der Zeit weitere Funktionen hinzufügen und mehr Geräte unterstützen. Das aktuelle Paket enthält eine Low-Level API, aber wir arbeiten bereits an einer High-Level- API , die auf Komponenten basiert und mit DOTSkompatibel ist. Dadurch soll die Leistungsanpassung in Ihren Unity Projekten noch einfacher werden. Bleiben Sie dran für weitere Informationen.
Eine Vorschauversion von Adaptive Performance ist jetzt für Unity 2019.1 (Beta) über den Unity Package Manager verfügbar. Sie können hierdarauf zugreifen. Um aktuelle Informationen zu Adaptive Performance zu erhalten, zu sehen, wie andere Entwickler es verwenden, und um Fragen oder Kommentare zu stellen, besuchen Sie bitte das Forum.
