Freigeben über


Grundlegendes zur Leistung für Mixed Reality

Dieser Artikel enthält eine Einführung in die Bedeutung der Leistung für Ihre Mixed Reality-App. Die Benutzererfahrung kann erheblich beeinträchtigt werden, wenn Ihre Anwendung nicht mit optimaler Bildfrequenz ausgeführt wird. Hologramme erscheinen instabil, und die Kopfnachverfolgung der Umgebung ist ungenau, was zu einer schlechten Erfahrung für den Benutzer führt. Die Leistung muss als erstklassiges Feature für die Mixed Reality-Entwicklung und nicht als Feinschliff betrachtet werden.

Die leistungsfähigen Frameratewerte für jede Zielplattform sind unten aufgeführt.

Plattform Zielbildrate
HoloLens 60 FPS
Windows Mixed Reality Ultra PCs 90 FPS
Windows Mixed Reality PCs 60 FPS

Das folgende Framework beschreibt bewährte Methoden zum Erreichen von Zielframeraten. Tipps zum Messen und Verbessern der Framerate in der Unity-Umgebung finden Sie im Artikel Leistungsempfehlungen für Unity.

Grundlegendes zu Leistungsengpässen

Wenn Ihre App eine unterdurchschnittliche Framerate aufweist, besteht der erste Schritt darin, zu analysieren und zu verstehen, wo Ihre Anwendung rechenintensiv ist. Es gibt zwei primäre Prozessoren, die für die Arbeit zum Rendern Ihrer Szene verantwortlich sind: die CPU und die GPU, die jeweils verschiedene Aspekte Ihrer Mixed Reality-App behandeln. Die drei wichtigsten Orte, an denen Engpässe auftreten können, sind:

  1. App-Thread – CPU : Verantwortlich für Ihre App-Logik, einschließlich Verarbeitung von Eingaben, Animationen, Physik und anderer App-Logik.
  2. Renderthread – CPU auf GPU – Verantwortlich für die Übermittlung Ihrer Draw-Aufrufe an die GPU. Wenn Ihre App ein Objekt wie einen Cube oder ein Modell rendern möchte, sendet dieser Thread eine Anforderung an die GPU, um die Vorgänge auszuführen.
  3. GPU : Am häufigsten wird die Grafikpipeline Ihrer Anwendung verarbeitet, um 3D-Daten (Modelle, Texturen usw.) in Pixel zu transformieren. Letztendlich wird ein 2D-Bild erzeugt, das an den Bildschirm Ihres Geräts übermittelt werden soll.

Lebensdauer eines Frames

Im Allgemeinen sind HoloLens-Anwendungen gpugebunden, aber nicht immer. Verwenden Sie die unten aufgeführten Tools und Techniken, um zu verstehen, wo ihre bestimmte App eng ist.

So analysieren Sie Ihre Anwendung

Es gibt viele Tools, mit denen Sie das Leistungsprofil und potenzielle Engpässe in Ihrer Mixed Reality-Anwendung verstehen können.

Im Folgenden finden Sie einige gängige Tools, mit denen Sie umfassende Profilerstellungsinformationen für Ihre Anwendung sammeln können:

Profilerstellung in einer beliebigen Umgebung

Eine Möglichkeit, um festzustellen, ob Ihre App GPU- oder CPU-gebunden ist, besteht darin, die Auflösung der Renderzielausgabe zu verringern. Indem Sie die Anzahl der zu berechnenden Pixel verringern, verringern Sie die GPU-Last. Das Gerät wird in einer kleineren Textur gerendert und dann nach oben gemustert, um Ihr endgültiges Bild anzuzeigen.

Nach dem Verringern der Renderingauflösung, wenn:

  1. Die Anwendungsframerate steigt, dann sind Sie wahrscheinlich GPU-gebunden.
  2. Anwendungsframerate unverändert, dann sind Sie wahrscheinlich CPU-gebunden

Hinweis

Unity bietet die Möglichkeit, die Renderzielauflösung Ihrer Anwendung zur Laufzeit einfach über die XRSettings.renderViewportScale-Eigenschaft zu ändern. Das endgültige Bild, das auf dem Gerät angezeigt wird, hat eine feste Auflösung. Die Plattform wird die Ausgabe der niedrigeren Auflösung abtasten, um ein Bild mit höherer Auflösung für das Rendern auf Displays zu erstellen.

UnityEngine.XR.XRSettings.renderScale = 0.7f;

So verbessern Sie Ihre Anwendung

Empfehlungen zur CPU-Leistung

Im Allgemeinen umfasst der Großteil der Arbeit in einer Mixed Reality-Anwendung auf der CPU die "Simulation" der Szene und die Verarbeitung Ihrer Anwendungslogik. Die folgenden Bereiche sind für die Optimierung vorgesehen:

  • Animationen
  • Physik
  • Speicherbelegungen
  • Komplexe Algorithmen (d.h. umgekehrte Kinematik, Pfadsuche)

GPU-Leistungsempfehlungen

Grundlegendes zu Bandbreite und Füllrate

Beim Rendern eines Frames auf der GPU ist eine Anwendung entweder an die Speicherbandbreite oder die Füllrate gebunden.

  • Arbeitsspeicherbandbreite ist die Rate der Lese- und Schreibvorgänge, die die GPU aus dem Arbeitsspeicher ausführen kann.
    • Um Bandbreitenbeschränkungen zu identifizieren, verringern Sie die Texturqualität, und überprüfen Sie, ob sich die Framerate verbessert hat.
    • Um Füllratenbeschränkungen zu identifizieren, verringern Sie die Anzeigeauflösung, und überprüfen Sie, ob sich die Framerate verbessert.

Hinweis

Wenn Sie mit Unity arbeiten, lesen Sie unsere Unity-spezifischen GPU-Leistungsempfehlungen. – Verwenden Sie in Unity die XRSettings.renderViewportScale-Eigenschaft .

Die Speicherbandbreite umfasst im Allgemeinen Optimierungen für eine der folgenden Optionen:

  1. Niedrigere Texturauflösungen
  2. Verwenden Sie weniger Texturen (Normal, Glanz usw.)

Die Füllrate konzentriert sich auf die Reduzierung der Anzahl von Vorgängen, die für ein abschließend gerendertes Pixel berechnet werden müssen, einschließlich:

  1. Anzahl der zu rendernden/zu verarbeitenden Objekte
  2. Anzahl von Vorgängen pro Shader
  3. Anzahl der GPU-Phasen zum Endergebnis (Geometrieshader, Nachbearbeitungseffekte usw.)
  4. Anzahl der zu rendernden Pixel (Anzeigeauflösung)

Reduzieren der Polygonanzahl

Eine höhere Polygonanzahl führt zu mehr Vorgängen für die GPU, sodass das Reduzieren der Anzahl von Polygonen in Ihrer Szene die Renderzeit reduziert. Es gibt andere Faktoren, die die Schattierung der Geometrie teuer machen, aber die Polygonanzahl ist die einfachste Metrik, um zu bestimmen, wie viel Arbeit zum Rendern einer Szene erforderlich ist.

Grenzwert für Überzeichnung

Eine hohe Überzeichnung tritt auf, wenn mehrere Objekte gerendert, aber nicht auf dem Bildschirm angezeigt werden, da sie von einem verdeckenden Objekt ausgeblendet werden. Stellen Sie sich vor, Sie sehen sich eine Wand an, die Objekte dahinter hat. Die gesamte Geometrie würde zum Rendern verarbeitet, aber nur die undurchsichtige Wand muss gerendert werden, was zu unnötigen Vorgängen führt.

Shader

Shader sind kleine Programme, die auf der GPU ausgeführt werden und zwei wichtige Schritte beim Rendern ausführen:

  1. Bestimmen, welche Scheitelpunkte gezeichnet werden sollen und wo sie sich im Bildschirmbereich befinden (Vertex-Shader)
    • Der Vertex-Shader wird pro Vertex für jedes Gitter ausgeführt.
  2. Bestimmen der Farbe der einzelnen Pixel (Pixelshader)
    • Der Pixelshader wird pro Pixel ausgeführt und von der Geometrie in der Ziel-Rendertextur gerendert.

In der Regel führen Shader viele Transformationen und Beleuchtungsberechnungen durch. Obwohl komplexe Beleuchtungsmodelle, Schatten und andere Vorgänge fantastische Ergebnisse erzielen können, haben sie auch ihren Preis. Das Reduzieren der Anzahl von Vorgängen, die in Shadern berechnet werden, kann die Arbeit, die für die GPU pro Frame erforderlich ist, erheblich reduzieren.

Empfehlungen zur Shadercodierung
  • Verwenden Sie nach Möglichkeit die bilineare Filterung.
  • Neu anordnen von Ausdrücken, um intrinsische MAD-Funktionen zum gleichzeitigen Multiplizieren und Hinzufügen zu verwenden
  • Berechnen Sie so viel wie möglich auf der CPU und übergeben Sie als Konstanten an das Material.
  • Bevorzugen von Verschiebungsvorgängen vom Pixelshader zum Vertex-Shader
    • Im Allgemeinen ist die Anzahl der Scheitelpunkte viel kleiner als die Anzahl der Pixel (720p ist 921.600 Pixel, 1080p ist 2.073.600 Pixel usw.)

Entfernen von GPU-Phasen

Nachbearbeitungseffekte können teuer sein und die Füllrate Ihrer Anwendung erhöhen, einschließlich Antialiasing-Techniken wie MSAA. Auf HoloLens wird empfohlen, diese Techniken und zusätzliche Shaderstufen wie Geometrie-, Rumpf- und Compute-Shader zu vermeiden.

Speicherempfehlungen

Übermäßige Speicherbelegungs- und Freigabevorgänge können zu inkonsistenter Leistung, fixierten Frames und anderem nachteiligen Verhalten führen. Es ist besonders wichtig, die Speicherüberlegungen bei der Entwicklung in Unity zu verstehen, da die Speicherverwaltung vom Garbage Collector gesteuert wird.

Objektpooling

Objektpooling ist eine beliebte Technik, um die Kosten für fortlaufende Zuordnungen und Aufhebungen von Objekten zu reduzieren. Dies geschieht, indem ein großer Pool identischer Objekte zugeordnet und inaktive, verfügbare Instanzen aus diesem Pool wiederverwenden, anstatt objekte im Laufe der Zeit ständig zu erstellen und zu zerstören. Objektpools eignen sich hervorragend für wiederverwendbare Komponenten, die während einer App eine variable Lebensdauer aufweisen.

Siehe auch