Produktneuigkeiten

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, Beispielcode und mehr bereitstellen, um Ihnen zu helfen, 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. Wir möchten Sie dabei unterstützen, die bestmögliche Leistung aus Ihrer XR‑App herauszuholen.

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

In diesem Leitfaden werden die wichtigsten Leistungsoptimierungen für die Android XR-Entwicklung beschrieben. Du erfährst, welche Funktionen die größten Leistungssteigerungen bringen, wann du sie verwenden solltest und wie sie zusammenarbeiten, damit du deine Framerate-Ziele erreichst.

Das ist unser Ziel: 

  • Mindestens : 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 Framerate beizubehalten, findest du 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, die zwei Modi hat. Der erste ist ein statischer Modus, bei dem die Mitte des Bildschirms mit einer höheren Auflösung gerendert wird. Je weiter außen Sie sich befinden, desto niedriger wird die Auflösung.

Der zweite ist der Eye-Tracking-Modus, bei dem der Bereich, auf den Sie blicken, in voller Detailtiefe gerendert wird, während die Qualität in den Randbereichen reduziert wird. Im Grunde wird damit die Funktionsweise des menschlichen Sehens nachgeahmt, bei dem wir nur in dem 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. Das Schöne am foveated Rendering ist, dass die Nutzer die reduzierte Qualität in ihrem peripheren Sichtfeld nicht bemerken, die GPU aber die verbesserte Leistung.

Stellen Sie sich vor, Sie erstellen eine Museumstour mit komplexen 3D-Artefakten. Ohne Foveated Rendering wäre es schwierig, 90 fps aufrechtzuerhalten, wenn alles im Sichtfeld gerendert werden müsste. Mit Foveated Rendering können Sie die High-Poly-Details dort beibehalten, wo der Nutzer hinsieht, während die Hintergrundumgebung in einer niedrigeren Qualität gerendert wird. Ihre Nutzer werden den Unterschied nicht bemerken, aber Sie haben die Möglichkeit, Ihrer Szene mehr Details hinzuzufügen.

Vulkan-Subsampling

Vulkan-Subsampling ist die perfekte Ergänzung für Foveated Rendering. Während beim foveated Rendering entschieden wird, was in verschiedenen Qualitätsstufen gerendert werden soll, wird beim Vulkan-Subsampling festgelegt, wie die verschiedenen Qualitätsstufen mithilfe von Fragmentdichtekarten effizient gerendert werden.

In Kombination mit Foveated Rendering bietet Vulkan Subsampling eine zusätzliche Leistung von 0, 5 ms. Außerdem werden gezackte Kanten im peripheren Sichtfeld geglättet, sodass das Bild insgesamt klarer wirkt.

In einem Flugsimulator-Spiel, in dem sich Nutzer auf Instrumente und Steuerelemente konzentrieren, werden die detaillierten Steuerelemente durch die Kombination von Foveated Rendering mit Vulkan-Subsampling scharf dargestellt, während die periphere Cockpitstruktur weniger Ressourcen verbraucht. Diese zusätzlichen 0,5 ms klingen nicht nach viel, aber sie machen den Unterschied aus, ob Platz für ein zusätzliches interaktives Element ist oder ob in intensiven Momenten Frames verloren gehen.

GPU-Funktionen für komplexe Szenen

Neben Foveated Rendering und Vulkan-Subsampling gibt es einige GPU-Funktionen, die unnötige Belastungen durch intelligentes Instanziieren 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-Instanziierung, um Zeichenbefehle 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 verteilt sind.

Stellen Sie sich eine Waldszene mit 200 Bäumen vor, die alle dasselbe Basis-Mesh verwenden. Ohne den GPU Resident Drawer werden 200 Zeichenbefehle von der GPU verarbeitet, wodurch die CPU entlastet wird. Wenn Sie diese Funktion aktivieren, instanziiert die GPU diese Bäume intelligent, was die Anzahl der Zeichenbefehle auf 5–10 reduzieren sollte. Das ist eine enorme GPU-Einsparung, die Sie dann in die Gameplay-Logik oder Physikberechnungen investieren können.

GPU-Occlusion-Culling

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

Diese Funktion ist besonders nützlich in Innenräumen mit mehreren Zimmern, dichten Umgebungen oder architektonischen Szenen, in denen Wände, Böden und Objekte die Sicht versperren.

Angenommen, Sie erstellen eine Multiroom-Anwendung für ein Haus. Wenn sich der Nutzer im Wohnzimmer befindet, warum sollten dann GPU-Zyklen für das Rendern der detaillierten Küche verschwendet werden, die vollständig hinter einer Wand verborgen ist? Beim GPU Occlusion Culling wird das Rendern dieser verdeckten Objekte automatisch übersprungen, sodass mehr Leistungsbudget für die tatsächlich sichtbaren Objekte zur Verfügung steht.

Leistung beobachten

Es reicht nicht aus, diese Funktionen nur zu verwenden. Außerdem müssen Sie Ihre Optimierungen messen, um ihre Auswirkungen zu quantifizieren und zu überprüfen, ob Ihre Änderungen tatsächlich funktionieren.

Performance Metrics API

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

Legen Sie eine Baseline fest, bevor Sie Änderungen vornehmen, wenden Sie eine Optimierung an, messen Sie die Auswirkungen und wiederholen Sie den Vorgang. Dank dieses datengestützten Ansatzes 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 das foveated Rendering, messen Sie noch einmal und hoffentlich sehen Sie, dass der Wert auf 9 ms sinkt. Das sind 4 ms mehr Zeit, um Ihrer Szene mehr Details hinzuzufügen, die visuelle Qualität an anderer Stelle zu verbessern oder einfach für eine flüssigere Leistung bei einer größeren Bandbreite von Inhalten zu sorgen.

Ohne diese Messwerte optimieren Sie blind. 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 integrierte Tool von Unity, mit dem Sie genau nachvollziehen können, wie Ihre Szene Frame für Frame gerendert wird. Sie sehen die Abfolge der Zeichenbefehle und können sie durchgehen, um zu prüfen, ob Ihre Optimierungen korrekt funktionieren.

Möchten Sie prüfen, ob der SRP-Batcher funktioniert? Suchen Sie im Frame Debugger nach „RenderLoopNewBatcher“-Einträgen. Prüfen, ob der GPU Resident Drawer ordnungsgemäß Batching durchführt? Suchen Sie nach Einträgen für „Hybrid Batch Group“. Anhand dieser visuellen Bestätigungen können Sie nachvollziehen, ob Ihre Optimierungseinstellungen tatsächlich wirksam sind.

Gehen Sie die ersten 50 Zeichenbefehle Ihrer Szene durch. Wenn Sie sehen, dass ähnliche Objekte einzeln und nicht im Batch gezeichnet werden, funktioniert die Instanziierung oder das Batching nicht richtig. Mit dem Frame Debugger werden diese Probleme sofort sichtbar, sodass Sie sie beheben können.

Zusätzliche Optimierungen

Neben den oben beschriebenen Optimierungen werden in unserem vollständigen Leitfaden zur Leistung auch einige weitere Optimierungen behandelt. Hier eine kurze Zusammenfassung:

  • URP-Einstellungen:Deaktivieren Sie HDR und Postprocessing für mobile XR. Diese Funktionen haben im Vergleich zu den Leistungskosten auf mobiler Hardware nur minimale visuelle Auswirkungen. Sie erzielen also messbare Leistungssteigerungen bei kaum wahrnehmbaren visuellen Unterschieden.
  • SRP Batcher: Reduziert den CPU-Overhead für Szenen mit vielen Materialien, die dieselbe Shader-Variante verwenden. Wenn Sie die Änderungen des Rendering-Status zwischen Zeichenbefehlen minimieren, können Sie die CPU-Zeit für das Rendering erheblich reduzieren.
  • Aktualisierungsrate des Displays:Die Aktualisierungsrate wird je nach Komplexität der Szene dynamisch zwischen 72 fps und 90 fps angepasst. Senke die Framerate bei komplexen Sequenzen, um die Stabilität zu gewährleisten, und erhöhe sie bei einfacheren Momenten für eine besonders flüssige Interaktion.
  • Tiefen-/undurchsichtige Texturen:Deaktivieren Sie diese, sofern sie nicht ausdrücklich für Shader-Effekte benötigt werden. Sie verursachen unnötige GPU-Kopiervorgänge, die Leistung verschwenden, ohne für die meisten Anwendungen einen Vorteil zu bieten.
  • URP-Renderskalierung : Mit dieser Einstellung können Sie die Auflösung reduzieren, um die Leistung zu verbessern, oder die Auflösung erhöhen, um die visuelle Qualität zu verbessern.

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

Fazit

Die Leistung Ihrer XR-App ist nicht nur ein technisches Kriterium, das es zu erfüllen gilt. Sie macht den Unterschied zwischen einer angenehmen, fesselnden Erfahrung und einer, die bei Nutzern zu Unwohlsein oder Übelkeit führt. Die besprochenen Optimierungen sind Ihr Toolkit, um die wichtigen Framerate-Ziele auf den neuesten XR-Geräten zu erreichen.

Hier ist Ihr Fahrplan:

  1. Beginne mit Foveated Rendering und Vulkan-Subsampling. Diese XR-spezifischen Funktionen sorgen für sofortige und spürbare GPU-Einsparungen.
  2. Fügen Sie GPU Resident Drawer und Occlusion Culling hinzu, wenn Sie komplexe Szenen mit wiederholter Geometrie oder Innenräumen haben.
  3. Mit der Performance Metrics API alles im Blick behalten, um sicherzustellen, dass die Änderungen tatsächlich hilfreich sind
  4. Zusätzliche URP-Optimierungen für mehr Leistungsspielraum

Es ist wichtig, kontinuierlich zu messen und zu iterieren. Nicht jede Optimierung ist für jedes Projekt gleichermaßen vorteilhaft. 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:

Verfasst von:
Weiterlesen