Produktneuheiten

Leistung für Android XR mit Unity optimieren

Lesezeit: 6 Minuten
Profil von Luke Hopkins ansehen
Luke Hopkins Developer Relations Engineer, Android

Das Samsung Galaxy XR ist da, mit Android XR! Dieser Blogpost ist Teil unserer Android XR Spotlight Week, in der wir Ressourcen wie Blogposts, Videos und Beispielcode bereitstellen, die Ihnen helfen sollen, Ihre Apps für Android XR zu entwickeln und vorzubereiten.  

Diese Woche hat Samsung das Galaxy XR vorgestellt, das in Zusammenarbeit mit Google und Qualcomm entwickelt wurde. Das ist eine aufregende Zeit für Entwickler. Wir möchten Ihnen helfen, die bestmögliche Leistung aus Ihrer XR-App herauszuholen.

Eine schlechte Leistung in Spielen und Apps auf Nicht-XR-Geräten kann für Nutzer frustrierend sein. In der Welt von XR ist Leistung jedoch nicht nur optional, sondern grundlegend für den Erfolg Ihrer App. Wenn Sie Ihr Ziel für die Bildrate in XR nicht erreichen, kann das zu weitaus ernsteren Problemen wie Bewegungskrankheit führen.

In diesem Leitfaden stellen wir Ihnen die wichtigsten Leistungsoptimierungen vor, die Sie für die Android XR-Entwicklung kennen müssen. Sie erfahren, mit welchen Funktionen Sie die größten Leistungssteigerungen erzielen können, wann Sie sie verwenden sollten und wie sie zusammenarbeiten, um Ihnen zu helfen, Ihre Ziele für die Bildrate zu erreichen.

Das sind unsere Ziele: 

  • Minimum: 72 fps (Teil unserer Qualitätsrichtlinien für Spiele)
  • Optional : 90 fps mit einem Budget von 11 ms pro Frame

Weitere Informationen dazu, warum es wichtig ist, eine so hohe Bildrate beizubehalten, finden Sie in unseren Leistungsrichtlinien.   

XR-spezifische Leistungsfunktionen

Wir beginnen mit zwei XR-spezifischen Leistungsfunktionen: Foveated Rendering und Vulkan Subsampling. 

Foveated Rendering

Foveated Rendering ist eine Optimierung mit zwei Modi. Der erste ist ein statischer Modus, der die Mitte des Bildschirms mit einer höheren Auflösung rendert und die Auflösung mit zunehmender Entfernung vom Mittelpunkt schrittweise verringert.

Der zweite ist der Eye-Tracking-Modus , der den Bereich, auf den Sie gerade schauen, detailliert rendert, während die Qualität in Ihrem peripheren Sichtfeld reduziert wird. Er ahmt im Wesentlichen die Funktionsweise des menschlichen Sehens nach, bei der wir nur im Bereich, auf den wir uns konzentrieren, feine Details sehen.

Foveated Rendering reduziert die GPU-Arbeitslast erheblich, ohne die wahrgenommene Bildqualität für den Nutzer zu beeinträchtigen. Der Vorteil von Foveated Rendering besteht darin, dass Nutzer die reduzierte Qualität im peripheren Sichtfeld nicht bemerken, Ihre GPU aber die verbesserte Leistung sicherlich bemerkt.

Stellen Sie sich vor, Sie entwickeln ein Museumserlebnis mit komplexen 3D-Artefakten. Ohne Foveated Rendering wäre es schwierig, 90 fps beizubehalten, wenn Sie alles im Sichtfeld rendern möchten. Mit Foveated Rendering können Sie die Details mit hoher Polygonzahl dort beibehalten, wo der Nutzer hinsieht, aber die Hintergrundumgebung wird mit geringerer Qualität gerendert. Ihre Nutzer werden den Unterschied nicht bemerken, aber Sie haben mehr Spielraum, um Ihrer Szene mehr Details hinzuzufügen.

Vulkan Subsampling

Vulkan Subsampling ist der beste Freund von Foveated Rendering. Während Foveated Rendering entscheidet, was mit unterschiedlichen Qualitätsstufen gerendert werden soll, kümmert sich Vulkan Subsampling darum, wie die verschiedenen Qualitätsstufen effizient gerendert werden , indem es Fragment Density Maps verwendet.

In Kombination mit Foveated Rendering bietet Vulkan Subsampling zusätzliche 0, 5 ms Leistung. Außerdem werden gezackte Kanten im peripheren Sichtfeld geglättet, wodurch das Gesamtbild sauberer aussieht.

In einem Flugsimulatorspiel, in dem sich Nutzer auf Instrumente und Bedienelemente konzentrieren, bedeutet die Kombination von Foveated Rendering und Vulkan Subsampling beispielsweise, dass die detaillierten Bedienelemente scharf gerendert werden, die periphere Cockpitstruktur aber weniger Ressourcen verbraucht. Die zusätzlichen 0,5 ms klingen nicht viel, können aber den Unterschied zwischen einem zusätzlichen interaktiven Element oder Frame-Drops in intensiven Momenten ausmachen.

GPU-Funktionen für komplexe Szenen

Neben Foveated Rendering und Vulkan Subsampling gibt es einige GPU-Funktionen, die unnötige Belastungen durch intelligentes Instancing und Culling reduzieren. Diese sind besonders effektiv für komplexe Szenen mit wiederholter Geometrie oder erheblicher Verdeckung.

GPU Resident Drawer

Der GPU Resident Drawer verwendet automatisch GPU-Instancing, um Draw Calls zu reduzieren und CPU-Verarbeitungszeit freizugeben. Anstatt dass die CPU die GPU einzeln über jedes Objekt informiert, fasst die GPU ähnliche Objekte zusammen.

Diese Funktion ist am effektivsten für große Szenen mit wiederholten Meshes, z. B. Bäume in einem Wald, Möbel in einem Bürogebäude oder Requisiten, die in einer Umgebung verstreut sind.

Stellen Sie sich eine Waldszene mit 200 Bäumen vor, die dasselbe Basis-Mesh verwenden. Ohne den GPU Resident Drawer gibt es 200 Draw Calls, die die GPU belasten und so die CPU entlasten. Wenn Sie diese Funktion aktivieren, instanziert die GPU diese Bäume auf intelligente Weise, wodurch die Anzahl der Draw Calls auf 5 bis 10 reduziert werden sollte. Das ist eine massive GPU-Einsparung, die Sie dann in die Spiellogik oder physikalischen Berechnungen investieren können.

GPU Occlusion Culling

GPU Occlusion Culling verwendet die GPU anstelle der CPU , um verdeckte Objekte zu identifizieren und das Rendering zu überspringen. Es erkennt automatisch, was hinter anderen Objekten verdeckt ist, sodass Sie Ihre GPU nicht für Dinge verschwenden, die der Nutzer nicht sehen kann.

Diese Funktion ist besonders leistungsstark in Innenräumen mit mehreren Räumen, dichten Umgebungen oder Architekturszenen, in denen Wände, Böden und Objekte die Sicht auf natürliche Weise versperren.

Nehmen wir an, Sie entwickeln ein Haus mit mehreren Räumen. Warum sollten Sie GPU-Zyklen für das Rendering der detaillierten Küche verschwenden, wenn sie sich hinter einer Wand befindet und der Nutzer sich im Wohnzimmer aufhält? GPU Occlusion Culling überspringt automatisch das Rendering dieser verdeckten Objekte und gibt Ihnen mehr Leistungsbudget für das frei, was tatsächlich sichtbar ist.

Monitoring Ihrer Leistung

Es reicht nicht aus, diese Funktionen nur zu verwenden. Sie müssen auch Ihre Optimierungen messen, damit Sie ihre Auswirkungen quantifizieren und überprüfen können, ob Ihre Änderungen tatsächlich funktionieren.

Performance Metrics API

Die Performance Metrics API bietet Echtzeit-Monitoring der Arbeitsspeichernutzung, CPU-Leistung und GPU-Leistung Ihrer Apps. Sie liefert umfassende Daten aus Compositor- und Laufzeitebenen, sodass Sie genau sehen können, was in Ihrer Anwendung passiert.

Legen Sie vor den Änderungen eine Baseline fest, wenden Sie eine Optimierung an, messen Sie die Auswirkungen und wiederholen Sie den Vorgang. Mit diesem datengesteuerten Ansatz wissen Sie, dass Sie die Leistung tatsächlich verbessern, anstatt nur zu raten.

Vor der Aktivierung von Foveated Rendering beträgt die GPU-Frame-Zeit möglicherweise 13 ms, was über Ihrem Budget von 11 ms liegt. Aktivieren Sie Foveated Rendering, messen Sie noch einmal und hoffentlich sinkt die Zeit auf 9 ms. Das sind 4 ms Spielraum, die Sie gewonnen haben, um Ihrer Szene mehr Details hinzuzufügen, die visuelle Qualität an anderer Stelle zu verbessern oder einfach eine flüssigere Leistung für eine größere Bandbreite von Inhalten zu gewährleisten.

Ohne diese Messwerte optimieren Sie im Blindflug. Die Performance Metrics API liefert Ihnen die Wahrheit darüber, was für Ihren spezifischen Anwendungsfall tatsächlich hilfreich ist.

Frame Debugger

Der Frame Debugger ist das in Unity integrierte Tool, mit dem Sie genau nachvollziehen können, wie Ihre Szene Frame für Frame gerendert wird. Er zeigt Ihnen die Reihenfolge der Draw Calls und ermöglicht es Ihnen, sie durchzugehen, um zu überprüfen, ob Ihre Optimierungen korrekt funktionieren.

Möchten Sie bestätigen, dass der SRP Batcher funktioniert? Suchen Sie im Frame Debugger nach Einträgen vom Typ „RenderLoopNewBatcher“. Möchten Sie prüfen, ob der GPU Resident Drawer ordnungsgemäß batcht? Suchen Sie nach Einträgen vom Typ „Hybrid Batch Group“. Diese visuellen Bestätigungen helfen Ihnen zu verstehen, ob Ihre Optimierungseinstellungen tatsächlich wirksam sind.

Gehen Sie die ersten 50 Draw Calls Ihrer Szene durch. Wenn ähnliche Objekte einzeln anstatt in Batches gezeichnet werden, bedeutet das, dass Ihr Instancing oder Batching nicht korrekt funktioniert. Der Frame Debugger macht diese Probleme sofort sichtbar, damit Sie sie beheben können.

Zusätzliche Optimierungen

Neben den oben beschriebenen Optimierungen enthält unser vollständiger Leistungsleitfaden auch einige weitere Optimierungen. Hier eine kurze Zusammenfassung:

  • URP-Einstellungen:Deaktivieren Sie HDR und die Nachbearbeitung für mobiles XR. Diese Funktionen haben im Vergleich zu ihren Leistungskosten auf mobiler Hardware nur minimale visuelle Auswirkungen. Sie erzielen also messbare Leistungssteigerungen mit kaum wahrnehmbaren visuellen Unterschieden.
  • SRP Batcher:Reduziert den CPU-Overhead für Szenen mit vielen Materialien, die dieselbe Shader-Variante verwenden. Indem Sie die Änderungen des Renderstatus zwischen Draw Calls minimieren, können Sie die für das Rendering benötigte CPU-Zeit erheblich reduzieren.
  • Bildwiederholrate:Dynamische Anpassung zwischen 72 fps und 90 fps je nach Komplexität der Szene. Reduzieren Sie die Bildrate bei komplexen Sequenzen, um die Stabilität zu erhalten, und erhöhen Sie sie bei einfacheren Momenten für eine besonders flüssige Interaktion.
  • Tiefen-/Opak-Texturen:Deaktivieren Sie diese, es sei denn, sie sind speziell für Shader-Effekte erforderlich. Sie verursachen unnötige GPU-Kopieroperationen, die Leistung verschwenden, ohne für die meisten Anwendungen einen Nutzen zu bringen.
  • URP-Renderskala: Mit dieser Einstellung können Sie mit einer reduzierten Auflösung rendern, um die Leistung zu verbessern, oder das Rendering hochskalieren, um die visuelle Qualität zu erhöhen.

Eine detaillierte Anleitung für diese und weitere Optimierungen finden Sie in unserem vollständigen Unity-Leistungsleitfaden für Android XR.

Fazit

Die Leistung Ihrer XR-App ist nicht nur ein technisches Häkchen. Sie macht den Unterschied zwischen einem komfortablen, ansprechenden Erlebnis und einem, bei dem sich Nutzer krank oder unwohl fühlen. Die von uns beschriebenen Optimierungen sind Ihr Werkzeugkasten, um diese kritischen Ziele für die Bildrate auf den neuesten XR-Geräten zu erreichen.

Hier ist Ihr Fahrplan:

  1. Beginnen Sie mit Foveated Rendering und Vulkan Subsampling. Diese XR-spezifischen Funktionen führen zu sofortigen und spürbaren GPU-Einsparungen.
  2. Fügen Sie den GPU Resident Drawer und Occlusion Culling hinzu, wenn Sie komplexe Szenen mit wiederholter Geometrie oder Innenräume haben.
  3. Behalten Sie alles mit der Performance Metrics API im Blick, um sicherzustellen, dass Ihre Änderungen tatsächlich helfen.
  4. Sehen Sie sich zusätzliche URP-Optimierungen an, um mehr Leistungsspielraum zu erhalten.

Es ist wichtig, kontinuierlich zu messen und zu iterieren. Nicht jede Optimierung ist für jedes Projekt gleichermaßen von Vorteil. Verwenden Sie daher die Performance Metrics API, um sich ein klares Bild davon zu machen, was für Ihren spezifischen Anwendungsfall tatsächlich hilfreich ist.

Nächste Schritte: Fähigkeiten erweitern

Sie möchten noch mehr erfahren? Dann sehen Sie sich gleich diese Infomaterialien an:

Geschrieben von:
Weiterlesen