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 einer optimalen Bildfrequenz ausgeführt wird. Hologramme erscheinen instabil, und die Kopfverfolgung 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 Polieraufgabe angesehen werden.

Die Werte der performanten Framerate 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

Im folgenden Framework werden bewährte Methoden zum Erreichen der Zielframerate beschrieben. 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 über eine unterdurchschnittliche Framerate verfügt, 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 Verarbeitungseingaben, Animationen, Physik und anderer App-Logik.
  2. Renderthread – CPU zu GPU – Verantwortlich für die Übermittlung Ihrer Zeichnungsaufrufe 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. Es erzeugt letztendlich ein 2D-Bild, 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.

Analysieren Ihrer 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 zum Bestimmen, 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 wird das endgültige Bild angezeigt.

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 Auflösung des Renderziels Ihrer Anwendung zur Laufzeit mithilfe der Eigenschaft XRSettings.renderViewportScale auf einfache Weise zu ändern. Das endgültige Bild, das auf dem Gerät angezeigt wird, hat eine feste Auflösung. Die Plattform führt ein Sampling der Ausgabe mit niedrigerer Auflösung durch, um ein Bild mit höherer Auflösung zum Rendern auf Displays zu erstellen.

UnityEngine.XR.XRSettings.renderScale = 0.7f;

So verbessern Sie Ihre Anwendung

CPU-Leistungsempfehlungen

Im Allgemeinen umfasst die 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
  • Physische Effekte
  • Speicherbelegungen
  • Komplexe Algorithmen (z. B. inverse Kinematik, Pfadsuche)

GPU-Leistungsempfehlungen

Grundlegendes zur Bandbreite im Vergleich zur Füllrate

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

  • Speicherbandbreite ist die Rate der Lese- und Schreibvorgänge, die die GPU aus ihrem Arbeitsspeicher durchfü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 folgendes:

  1. Niedrigere Texturauflösungen
  2. Verwenden Sie weniger Texturen (Normal, Spiegel 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 bis zum Endergebnis (Geometrie-Shader, Nachverarbeitungseffekte 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.

Einschränken des Überzeichnens

Eine hohe Überzeichnung tritt auf, wenn mehrere Objekte gerendert, aber nicht auf dem Bildschirm angezeigt werden, da sie von einem verdeckten Objekt ausgeblendet werden. Stellen Sie sich vor, sie sehen sich eine Wand an, die Objekte dahinter hat. Die gesamte Geometrie würde für das 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 Scheitelpunkt für jedes Gitter ausgeführt.
  2. Bestimmen der Farbe jedes Pixels (der Pixel-Shader)
    • Der Pixel-Shader wird pro Pixel ausgeführt und von der Geometrie für die Zielrenderungstextur gerendert.

In der Regel führen Shader viele Transformationen und Beleuchtungsberechnungen durch. Obwohl komplexe Beleuchtungsmodelle, Schatten und andere Vorgänge fantastische Ergebnisse generieren können, haben sie auch einen Preis. Wenn Sie die Anzahl der in Shadern berechneten Vorgänge reduzieren, kann dies den Aufwand für die GPU pro Frame erheblich reduzieren.

Empfehlungen zur Shadercodierung
  • Verwenden Von bilinearer Filterung nach Möglichkeit
  • 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.
  • Verschieben von Vorgängen vom Pixel-Shader zum Vertex-Shader bevorzugen
    • 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. Bei HoloLens wird empfohlen, diese Techniken und zusätzliche Shaderphasen wie Geometrie, Rumpf und Compute-Shader zu vermeiden.

Empfehlungen zum Arbeitsspeicher

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

Objektpooling

Objektpooling ist eine beliebte Technik, um die Kosten für fortlaufende Zuordnungen und Freigaben von Objekten zu reduzieren. Dies erfolgt durch Zuordnen eines großen Pools identischer Objekte und Wiederverwendung inaktiver, verfügbarer Instanzen aus diesem Pool, statt im Lauf der Zeit ständig neue Objekte zu erstellen und zu entfernen. Objektpools eignen sich hervorragend für wiederverwendbare Komponenten, die im Rahmen einer App eine variable Lebensdauer haben.

Weitere Informationen