Grundlegendes zur Leistung für Mixed Reality

Dieser Artikel ist eine Einführung in das Verständnis der Bedeutung der Leistung für Ihre Mixed Reality App. Die Benutzererfahrung kann erheblich beeinträchtigt werden, wenn Ihre Anwendung nicht bei optimaler Framerate ausgeführt wird. Hologramme erscheint instabil und die Kopfverfolgung der Umgebung ist ungenau, was zu einer schlechten Erfahrung für den Benutzer führt. Die Leistung muss als first class feature for mixed reality development und nicht als polnische Aufgabe betrachtet werden.

Die performanten Frameratewerte für jede Zielplattform werden unten aufgeführt.

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

Im folgenden Framework werden bewährte Methoden für die Treffer von Zielrahmenraten beschrieben. Tipps zum Messen und Verbessern der Framerate in der Unity-Umgebung empfehlen wir Ihnen, die Leistungsempfehlungen für Unity-Artikel zu lesen.

Grundlegendes zu Leistungsengpässen

Wenn Ihre App über eine unterperformende Framerate verfügt, besteht der erste Schritt darin, zu analysieren und zu verstehen, wo Ihre Anwendung berechnungsintensiver ist. Es gibt zwei primäre Prozessoren, die für das Rendern Ihrer Szene verantwortlich sind: die CPU und die GPU, die jeweils verschiedene Aspekte Ihrer Mixed Reality-App behandelt. Die drei wichtigsten Stellen, an denen Engpässe auftreten können:

  1. App-Thread - CPU - Verantwortlich für Ihre App-Logik, einschließlich Verarbeitung von Eingaben, Animationen, Physik und anderer App-Logik.
  2. Renderthread - CPU in GPU - Verantwortlich für das Übermitteln Ihrer Zeichnungsaufrufe an die GPU. Wenn Ihre App ein Objekt wie einen Würfel 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 behandelt die Grafikpipeline Ihrer Anwendung, um 3D-Daten (Modelle, Texturen usw.) in Pixel zu transformieren. Es erzeugt letztlich ein 2D-Bild, das an den Bildschirm Ihres Geräts übermittelt wird.

Lifetime of a Frame

Im Allgemeinen werden HoloLens Anwendungen GPU gebunden, aber nicht immer. Verwenden Sie die unten aufgeführten Tools und Techniken, um zu verstehen, wo Ihre bestimmte App Engpässe hat.

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.

Nachfolgend finden Sie einige allgemeine Tools, mit denen Sie tiefe Profilerstellungsinformationen für Ihre Anwendung sammeln können:

So profilieren Sie sich in einer beliebigen Umgebung

Eine Möglichkeit, zu ermitteln, ob Ihre App GPU oder CPU-Bindung ist, um die Auflösung der Renderzielausgabe zu verringern. Indem Sie die Anzahl der zu berechnenden Pixel reduzieren, verringern Sie die GPU-Auslastung. Das Gerät wird in einer kleineren Textur gerendert, und anschließend wird das endgültige Bild angezeigt.

Nach niedrigerer Renderingauflösung, wenn:

  1. Die Anwendungsframerate erhöht sich, und 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

Die meisten Arbeiten in einer Mixed Reality-Anwendung auf der CPU umfassen im Allgemeinen die "Simulation" der Szene und die Verarbeitung Ihrer Anwendungslogik. Die folgenden Bereiche sind für die Optimierung ausgerichtet:

  • Animationen
  • Physische Effekte
  • Speicherzuweisungen
  • Komplexe Algorithmen (z. B. inverse kinematische, Pfadsuche)

GPU-Leistungsempfehlungen

Grundlegendes zu Bandbreite und 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 die Framerate verbessert wurde.
    • Um Füllratenbeschränkungen zu identifizieren, verringern Sie die Anzeigeauflösung und sehen Sie, ob die Framerate verbessert wird.

Hinweis

Wenn Sie mit Unity arbeiten, lesen Sie unsere Empfehlungen für die Gpu-spezifische GPU-Leistung. - Verwenden Sie in Unity die XRSettings.renderViewportScale-Eigenschaft

Die Speicherbandbreite umfasst in der Regel Optimierungen für entweder:

  1. Geringere Texturauflösungen
  2. Verwenden Sie weniger Texturen (Normalität, Spekulär usw.)

Die Füllrate konzentriert sich auf die Verringerung der Anzahl der Vorgänge, die für ein endgültiges gerendertes Pixel berechnet werden müssen, einschließlich:

  1. Anzahl der Objekte, die gerendert/verarbeitet werden sollen
  2. Anzahl der Vorgänge pro Shader
  3. Anzahl der GPU-Phasen zum Endergebnis (Geometrie-Shader, Nachverarbeitungseffekte usw.)
  4. Anzahl der Zu rendernden Pixel (Anzeigeauflösung)

Reduzieren der Polygonanzahl

Höhere Polygonanzahlen führen zu mehr Vorgängen für die GPU, sodass die Anzahl der Polygone in Ihrer Szene die Renderzeit reduziert. Es gibt andere Faktoren, die das Schattierung der Geometrie teuer machen, aber die Polygonanzahl ist die einfachste Metrik, um zu bestimmen, wie viel Arbeit benötigt wird, um eine Szene zu rendern.

Einschränken des Überzeichnens

Hohe Überziehung tritt auf, wenn mehrere Objekte gerendert werden, aber nicht auf dem Bildschirm angezeigt werden, da sie durch ein occluding-Objekt ausgeblendet sind. Imagine sich eine Wand ansehen, die Objekte hinter sich hat. Alle Geometrien werden 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 Bildschirmraum befinden (der Vertex-Shader)
    • Der Vertex-Shader wird pro Vertex für jedes Gitter ausgeführt.
  2. Bestimmen der Farbe jedes Pixels (der Pixel-Shader)
    • Der Pixel-Shader wird pro Pixel ausgeführt und durch die Geometrie an die Ziel rendertextur gerendert.

In der Regel führen Shader viele Transformationen und Beleuchtungsberechnungen aus. Obwohl komplexe Beleuchtungsmodelle, Schatten und andere Vorgänge fantastische Ergebnisse generieren können, sind sie auch mit einem Preis ausgestattet. Durch die Verringerung der Anzahl von Vorgängen, die in Shadern berechnet werden, können die für die GPU pro Frame benötigten Arbeit erheblich reduziert werden.

Shadercodierungsempfehlungen
  • Verwenden von Bilinearfiltern, wann immer möglich
  • Neuanordnen von Ausdrücken zum Verwenden von MAD-systemeigenen Ausdrücken, um eine Multiplikation und ein Add gleichzeitig zu erledigen
  • Vorberechnung so viel wie möglich auf der CPU und übergeben als Konstanten an das Material
  • Bevorzugtes Verschieben von Vorgängen vom Pixel-Shader 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 Antialiasingtechniken wie MSAA. Bei HoloLens empfehlen wir, diese Techniken und zusätzliche Shaderstufen wie Geometrie, Rumpf und Computehader zu vermeiden.

Empfehlungen zum Arbeitsspeicher

Übermäßige Speicherzuweisungs- und Deallocation-Vorgänge können zu inkonsistenter Leistung, fixierten Frames und anderen schädlichen Verhaltensweisen führen. Es ist besonders wichtig, Speicherüberlegungen beim Entwickeln in Unity zu verstehen, da die Speicherverwaltung vom Garbage Collector gesteuert wird.

Objektpooling

Objektpooling ist eine beliebte Technik, um die Kosten für kontinuierliche Zuordnungen und Deallocations 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.

Siehe auch