Produktneuheiten

Leistung für Android XR mit Unity optimieren

6 Minuten Lesezeit
Luke Hopkins
Developer Relations Engineer, Android

Das 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 auf den Markt gebracht, 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 Framerate in XR verfehlen, kann das zu weitaus schwerwiegenderen Problemen wie Reisekrankheit führen.

In diesem Leitfaden erfahren Sie mehr über die wichtigsten Leistungsoptimierungen, die Sie für die Android XR-Entwicklung kennen müssen. Sie lernen, mit welchen Funktionen Sie die größte Leistungssteigerung erzielen, wann Sie sie verwenden sollten und wie sie zusammenarbeiten, um Ihnen zu helfen, Ihre Ziele für die Framerate 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 Framerate 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 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 besteht darin, 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 eine Museumserfahrung mit komplexen 3D-Artefakten. Ohne Foveated Rendering wäre es schwierig, 90 fps beizubehalten, wenn Sie versuchen, alles im Sichtfeld zu rendern. 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 in Ihrem 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. Diese zusätzlichen 0,5 ms klingen nicht viel, können aber den Unterschied zwischen einem zusätzlichen interaktiven Element und 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 in einer Umgebung.

Stellen Sie sich eine Waldszene mit 200 Bäumen vor, die dasselbe 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 versperren.

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 voll detaillierten Küche verschwenden, die komplett 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 Ihre Optimierungen auch 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.

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 überprü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, sodass 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:Dynamische Anpassung zwischen 72 fps und 90 fps je nach Komplexität der Szene. Reduzieren Sie die Framerate 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-/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 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 Kontrollkästchen. Sie macht den Unterschied zwischen einer komfortablen, ansprechenden Erfahrung und einer, bei der sich Nutzer krank oder unwohl fühlen. Die von uns behandelten Optimierungen sind Ihr Werkzeug, um diese kritischen Ziele für die Framerate 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 eine klare Vorstellung davon zu erhalten, was für Ihren spezifischen Anwendungsfall tatsächlich hilfreich ist.

Nächste Schritte: Ihre Fähigkeiten erweitern

Möchten Sie noch mehr erfahren? Hier finden Sie weitere Informationen:

Verfasst von:

Weiterlesen