Produktneuheiten

Leistung für Android XR mit Unity optimieren

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

Samsung Galaxy XR ist da – powered by 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 Ihre Zielbildrate 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 Zielbildraten zu erreichen.

Das sind unsere Ziele: 

  • Minimum: 72 fps (Teil unserer Qualitätsrichtlinien)
  • 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 , bei dem die Mitte des Bildschirms mit einer höheren Auflösung gerendert wird. Die Auflösung wird dann immer weiter verringert, je weiter Sie nach außen schauen.

Der zweite ist der Eye-Tracking-Modus , bei dem der Bereich, auf den Sie gerade schauen, detailliert gerendert wird, während die Qualität in Ihrem peripheren Sichtfeld reduziert wird. Er ahmt im Wesentlichen die Funktionsweise des menschlichen Sehens nach, bei dem 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 ist, dass Nutzer die reduzierte Qualität in ihrem peripheren Sichtfeld nicht bemerken, Ihre GPU aber die verbesserte Leistung sicherlich bemerken wird.

Stellen Sie sich vor, Sie entwickeln ein Museumserlebnis mit komplexen 3D-Artefakten. Ohne Foveated Rendering würden Sie Schwierigkeiten haben, 90 fps zu erreichen, da Sie alles im Sichtfeld rendern müssten. Mit Foveated Rendering können Sie die Details mit hoher Polygonzahl dort beibehalten, wo der Nutzer hinsieht, aber die Hintergrundumgebung wird mit einer geringeren 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 in Ihrem peripheren Sichtfeld geglättet, wodurch das Gesamtbild sauberer aussieht.

In einem Flugsimulatorspiel, in dem sich Nutzer auf Instrumente und Bedienelemente konzentrieren, werden durch die Kombination von Foveated Rendering und Vulkan Subsampling die detaillierten Bedienelemente scharf gerendert, während die periphere Cockpitstruktur weniger Ressourcen verbraucht. Diese 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 der GPU jedes Objekt einzeln mitteilt, 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, werden die Bäume von der GPU intelligent instanziert, 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 in physikalische 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 verdecken.

Nehmen wir an, Sie entwickeln ein Haus mit mehreren Räumen. Wenn sich der Nutzer im Wohnzimmer befindet, warum sollten Sie dann GPU-Zyklen für das Rendering der detaillierten Küche verschwenden, die vollständig hinter einer Wand verborgen ist? GPU Occlusion Culling überspringt automatisch das Rendering dieser verdeckten Objekte, sodass Sie mehr Leistungsbudget für das haben, 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, der CPU-Leistung und der GPU-Leistung Ihrer Apps. Sie liefert umfassende Daten aus den Compositor- und Laufzeitebenen, sodass Sie genau sehen können, was in Ihrer Anwendung passiert.

Erstellen Sie eine Baseline, bevor Sie Änderungen vornehmen, 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.

Bevor Sie Foveated Rendering aktivieren, beträgt die GPU-Frame Time 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 Bildqualitä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 korrekt 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 Sie sehen, dass ä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 werden in unserem vollständigen Leistungsleitfaden auch einige weitere Optimierungen behandelt. 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 des Displays: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 dann bei einfacheren Momenten für eine besonders flüssige Interaktion.
  • Tiefen-/opake 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 Bildqualitä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 behandelten Optimierungen sind Ihr Werkzeug, um diese kritischen Zielbildraten auf den neuesten XR-Geräten zu erreichen.

So geht es weiter:

  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 mit der Performance Metrics API alles 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 eine klare Vorstellung davon zu erhalten, 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