Leistung — MRTK2
Erste Schritte
Die einfachste Möglichkeit zum Rationalisieren der Leistung ist die Framerate oder das Rendern eines Bilds pro Sekunde durch Ihre Anwendung. Es ist wichtig, die Zielframerate zu erreichen, wie durch die Zielplattform (z. B. Windows Mixed Reality, Oculus usw.) beschrieben wird. Auf HoloLens beträgt die Zielframerate beispielsweise 60 FPS. Anwendungen mit niedriger Framerate können zu einer Verschlechterung der Benutzererfahrung führen, z. B. zu einer verschlechterten Hologrammstabilisierung, Weltverfolgung, Handtracking und mehr. Damit Entwickler eine qualitativ hochwertige Framerate nachverfolgen und erzielen können, bietet Mixed Reality Toolkit eine Vielzahl von Tools und Skripts.
Visueller Profiler
Um die Leistung während der Gesamten Lebensdauer der Entwicklung kontinuierlich nachzuverfolgen, wird dringend empfohlen, beim Ausführen & Debuggen einer Anwendung immer ein Visuelles mit Framerate anzuzeigen. Mixed Reality Toolkit stellt das Visual Profiler-Diagnosetool bereit, das Echtzeitinformationen zur aktuellen FPS- und Speicherauslastung in der Anwendungsansicht bereitstellt. Der visuelle Profiler kann über die Diagnosesystemeinstellungen unter dem MRTK-Profilinspektor konfiguriert werden.
Darüber hinaus ist es besonders wichtig, den Visual Profiler zu verwenden, um die Framerate zu verfolgen, wenn sie auf dem Gerät ausgeführt wird, anstatt im Unity-Editor oder einem Emulator auszuführen. Die genauesten Leistungsergebnisse werden bei der Ausführung auf dem Gerät mit Releasekonfigurationsbuilds dargestellt.
Hinweis
Wenn Sie für Windows Mixed Reality erstellen, stellen Sie die Bereitstellung mit MASTER-Konfigurationsbuilds bereit.
Fenster "Optimieren"
Das MRTK-Optimierungsfenster bietet Informationen und Automatisierungstools, mit denen Mixed Reality-Entwickler ihre Umgebung für die besten Ergebnisse einrichten und potenzielle Engpässe in ihrer Szene & Ressourcen identifizieren können. Bestimmte Schlüsselkonfigurationen in Unity können dazu beitragen, wesentlich optimierte Ergebnisse für Mixed Reality-Projekte zu liefern.
Im Allgemeinen umfassen diese Einstellungen Renderingkonfigurationen, die sich ideal für Mixed Reality eignen. Mixed Reality-Anwendungen sind im Vergleich zur herkömmlichen 3D-Grafikentwicklung einzigartig, da zwei Bildschirme (d. h. zwei Augen) für die gesamte Szene gerendert werden müssen.
Die unten aufgeführten empfohlenen Einstellungen können in einem Unity-Projekt mithilfe des MRTK-Optimierungsfensters automatisch konfiguriert werden.
Unity Profiler
Unity Profiler ist ein nützliches Tool, um Details zur Anwendungsleistung auf Frame-für-Frame-Ebene zu untersuchen.
Für die CPU aufgewendete Zeit
Um komfortable Frameraten (in der Regel 60 Frames pro Sekunde) aufrechtzuerhalten, müssen Anwendungen eine maximale Framezeit von 16,6 Millisekunden CPU-Zeit erreichen. Um die Kosten der MRTK-Funktionalität zu ermitteln, enthält Das Microsoft Mixed Reality Toolkit markers for inner loop (per frame) code paths. Diese Marker verwenden das folgende Format, um die spezifische Funktionalität zu verstehen, die verwendet wird:
[MRTK] className.methodName
Hinweis
Es können zusätzliche Daten nach dem Methodennamen vorhanden sein. Dies wird verwendet, um bedingt ausgeführte, potenziell teure Funktionen zu identifizieren, die durch kleine Änderungen am Anwendungscode vermieden werden können.
In diesem Beispiel wurde die Hierarchie erweitert, um zu zeigen, dass die UpdateHandData-Methode der WindowsMixedRealityArticulatedHand-Klasse während des zu analysierenden Frames 0,44 ms CPU-Zeit verbraucht. Diese Daten können verwendet werden, um festzustellen, ob ein Leistungsproblem im Zusammenhang mit Anwendungscode oder von einer anderen Stelle im System steht.
Entwicklern wird dringend empfohlen, Anwendungscode auf ähnliche Weise zu instrumentieren. Der Hauptfokus für die Instrumentierung von Anwendungscode liegt in Ereignishandlern, da diese Methoden der MRTK-Updateschleife in Rechnung gestellt werden, wenn Ereignisse ausgelöst werden. Hohe Framezeiten innerhalb der MRTK-Updateschleife können auf kostspieligen Code in Ereignishandlermethoden hindeuten.
Empfohlene Einstellungen für Unity
Single-Pass Instanzrendering
Die Standard-Renderingkonfiguration für XR in Unity ist Multidurchlauf. Diese Einstellung weist Unity an, die gesamte Renderpipeline zweimal auszuführen, einmal für jedes Auge. Dies kann optimiert werden, indem Stattdessen Single Pass Instanced rendering ausgewählt wird. Diese Konfiguration nutzt Renderzielarrays , um einen einzelnen Draw-Aufruf ausführen zu können, der Instanzen in das entsprechende Renderziel für jedes Auge eingibt. Darüber hinaus ermöglicht dieser Modus das gesamte Rendering in einer einzigen Ausführung der Renderingpipeline. Daher kann die Auswahl von Single Pass Instanced Rendering als Renderingpfad für eine Mixed Reality-Anwendung erheblich Zeit sparen, sowohl bei der CPU & GPU als auch bei der empfohlenen Renderingkonfiguration.
Um jedoch einen einzelnen Draw-Aufruf für jedes Gitter für jedes Auge auszustellen, muss die GPU-Instanziierung von allen Shadern unterstützt werden. Die Instanziierung ermöglicht es der GPU, Aufrufe über beide Augen zu multiplexen. Integrierte Unity-Shader sowie der MRTK-Standard-Shader enthalten standardmäßig die erforderlichen Anweisungen zur Instanziierung im Shadercode. Wenn Sie jedoch benutzerdefinierte Shader für Unity schreiben, müssen diese Shader möglicherweise aktualisiert werden, um das Rendern von Single Pass Instanced zu unterstützen.
Beispielcode für benutzerdefinierten Shader
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID //Insert
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
UNITY_VERTEX_OUTPUT_STEREO //Insert
};
v2f vert (appdata v)
{
v2f o;
UNITY_SETUP_INSTANCE_ID(v); //Insert
UNITY_INITIALIZE_OUTPUT(v2f, o); //Insert
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); //Insert
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
return o;
}
Qualitätseinstellungen
Unity stellt Voreinstellungen bereit, um die Qualität des Renderings für jeden Plattformendpunkt zu steuern. Diese Voreinstellungen steuern, welche grafischen Features aktiviert werden können, z. B. Schatten, Antialiasing, globale Beleuchtung und vieles mehr. Es wird empfohlen, diese Einstellungen zu verringern und die Anzahl der während des Renderings ausgeführten Berechnungen zu optimieren.
Schritt 1: Aktualisieren von Mixed Reality-Unity-Projekten zur Verwendung der Einstellung "Niedrige Qualität "
Redigieren>Projekteinstellungen, und wählen Sie dann die Kategorie >Qualität Wählen Sie niedrige Qualität für die UWP-Plattform aus.
Schritt 2: Deaktivieren Sie für jede Unity-Szenendatei globale Beleuchtung in Echtzeit.
Fenster>Wiedergabe>Beleuchtungseinstellungen>Deaktivieren Sie globale Echtzeitbeleuchtung.
Tiefenpufferfreigabe (HoloLens)
Bei der Entwicklung für die Windows Mixed Reality Plattform und insbesondere HoloLens kann die Aktivierung der Tiefenpufferfreigabe unter XR-Einstellungen bei der Stabilisierung des Hologramms hilfreich sein. Die Verarbeitung des Tiefenpuffers kann jedoch Leistungseinbußen verursachen, insbesondere bei Verwendung des 24-Bit-Tiefenformats. Daher wird dringend empfohlen , den Tiefenpuffer auf 16-Bit-Genauigkeit zu konfigurieren.
Wenn Z-Fighting aufgrund des niedrigeren Bitformats auftritt, vergewissern Sie sich, dass die entfernte Clipebene aller Kameras auf den niedrigsten möglichen Wert für die Anwendung festgelegt ist. Unity legt standardmäßig eine weit entfernte Clipebene von 1000 m fest. Auf HoloLens ist eine weit entfernte Clipebene von 50 m in der Regel für die meisten Anwendungsszenarien mehr als ausreichend.
Hinweis
Bei Verwendung des 16-Bit-Tiefenformats funktionieren die erforderlichen Schablonenpuffereffekte nicht, da Unity in dieser Einstellung keinen Schablonenpuffer erstellt . Wenn Sie umgekehrt das 24-Bit-Tiefenformat auswählen, wird in der Regel ein 8-Bit-Schablonenpuffer erstellt, falls zutreffend auf der Endpunktgrafikplattform.
Wenn Sie eine Mask-Komponente verwenden, die den Schablonenpuffer erfordert, sollten Sie stattdessen RectMask2D verwenden, das den Schablonenpuffer nicht erfordert und daher in Verbindung mit einem 16-Bit-Tiefenformat verwendet werden kann.
Hinweis
Um schnell zu ermitteln, welche Objekte in einer Szene nicht visuell in den Tiefenpuffer schreiben, können Sie das Hilfsprogramm Render depth buffer (Rendern des Tiefenpuffers) unter den Editor Settings (Einstellungen) im MRTK-Konfigurationsprofil verwenden.
Optimieren von Gitterdaten
Mit den Einstellungen Gitterdaten optimieren wird versucht, nicht verwendete Scheitelpunktattribute in Ihrer Anwendung zu entfernen. Die Einstellung führt dazu jeden Shaderdurchlauf in jedem Material aus, das sich auf jedem Gitter im Build befindet. Dies ist gut für die Größe von Spieldaten und die Laufzeitleistung, kann jedoch die Buildzeiten erheblich beeinträchtigen.
Es wird empfohlen, diese Einstellung während der Entwicklung zu deaktivieren und während der Erstellung des Builds "Master" erneut zu aktivieren. Die Einstellung finden Sie unterProjekteinstellungen>bearbeiten>Player>Andere Einstellungen>Gitterdaten optimieren.
Allgemeine Empfehlungen
Leistung kann eine mehrdeutige und sich ständig ändernde Herausforderung für Mixed Reality-Entwickler sein, und das Wissensspektrum zur Rationalisierung der Leistung ist groß. Es gibt jedoch einige allgemeine Empfehlungen, um zu verstehen, wie die Leistung für eine Anwendung angegangen werden kann.
Es ist nützlich, die Ausführung einer Anwendung in die Teile zu vereinfachen, die auf der CPU oder der GPU ausgeführt werden, und somit zu ermitteln, ob eine App durch eine der komponenten begrenzt ist. Es kann Engpässe geben, die sowohl Verarbeitungseinheiten als auch einige einzigartige Szenarien umfassen, die sorgfältig untersucht werden müssen. Für den Einstieg ist es jedoch gut zu verstehen, wo eine Anwendung für die meiste Zeit ausgeführt wird.
GPU-gebunden
Da die meisten Plattformen für Mixed Reality-Anwendungen stereoskopisches Rendering verwenden, ist es aufgrund der Art des Renderns eines "doppelt breiten" Bildschirms sehr üblich, gpugebunden zu sein. Darüber hinaus werden mobile Mixed Reality-Plattformen wie HoloLens oder Oculus Quest durch cpu-& GPU-Verarbeitungsleistung der mobilen Klasse eingeschränkt.
Wenn Sie sich auf die GPU konzentrieren, gibt es im Allgemeinen zwei wichtige Phasen, in denen eine Anwendung jeden Frame abschließen muss.
- Ausführen des Vertex-Shaders
- Ausführen des Pixelshaders (auch als Fragmentshader bezeichnet)
Ohne tief in das komplexe Feld der Computergrafik & Renderingpipelines einzutauchen, ist jede Shaderstufe ein Programm, das auf der GPU ausgeführt wird, um Folgendes zu erzeugen.
- Vertexshader transformieren Gittervertices in Koordinaten im Bildschirmbereich (d. h. pro Vertex ausgeführter Code)
- Pixelshader berechnen die Farbe, die für ein bestimmtes Pixel und Gitterfragment gezeichnet werden soll (d. h. Codeausführung pro Pixel)
In Bezug auf die Leistungsoptimierung ist es in der Regel fruchtbarer, sich auf die Optimierung der Vorgänge im Pixel-Shader zu konzentrieren. Eine Anwendung muss möglicherweise nur einen Würfel zeichnen, der nur aus acht Scheitelpunkten bestehen wird. Der Bildschirmbereich, den der Cube einnimmt, ist jedoch wahrscheinlich in der Größenordnung von Millionen von Pixeln. Daher kann die Reduzierung des Shadercodes um 10 Vorgänge deutlich mehr Arbeit sparen, wenn der Pixelshader reduziert wird als der Vertex-Shader.
Dies ist einer der Hauptgründe für die Nutzung des MRTK Standard Shader, da dieser Shader im Allgemeinen viel weniger Anweisungen pro Pixel & Vertex ausführt als der Unity Standard Shader und gleichzeitig vergleichbare ästhetische Ergebnisse erzielt.
CPU-Optimierungen | GPU-Optimierungen |
---|---|
Logik für die App-Simulation | Renderingvorgänge |
Vereinfachen der Physik | Reduzieren von Beleuchtungsberechnungen |
Vereinfachen von Animationen | Reduzieren der Polygonanzahl & Anzahl von zeichnungsfähigen Objekten |
Verwalten der Garbage Collection | Reduzieren der Anzahl transparenter Objekte |
Cacheverweise | Vermeiden von Nachbearbeitungs-/Vollbildeffekten |
Zeichnen der Aufrufeiierung
Einer der häufigsten Fehler in Unity, der die Leistung verringert, ist das Klonen von Materialien zur Laufzeit. Wenn GameObjects das gleiche Material und/oder dasselbe Gitter haben, können sie mithilfe von Techniken wie statischer Batchverarbeitung, dynamischer Batchverarbeitung und GPU-Instanziierung in einzelnen Draw-Aufrufen optimiert werden. Wenn entwickler jedoch eigenschaften eines Renderers zur Laufzeit ändern, erstellt Unity eine Klonkopie des zugewiesenen Materials.
Wenn in einer Szene beispielsweise 100 Würfel vorhanden sind, kann ein Entwickler jedem zur Laufzeit eine eindeutige Farbe zuweisen. Durch den Zugriff auf renderer.material.color in C# erstellt Unity ein neues Material im Arbeitsspeicher für diesen speziellen Renderer/GameObject. Jeder der 100 Cubes verfügt über ein eigenes Material und kann daher nicht zu einem Draw-Aufruf zusammengeführt werden, sondern zu 100 Draw-Aufrufanforderungen von der CPU an die GPU.
Um dieses Hindernis zu überwinden und dennoch eine eindeutige Farbe pro Würfel zuzuweisen, sollten Entwickler MaterialPropertyBlock nutzen.
private PropertyBlock m_PropertyBlock ;
private Renderer myRenderer;
private void Start()
{
myRenderer = GetComponent<Renderer>();
m_PropertyBlock = new MaterialPropertyBlock();
}
private void ChangeColor()
{
// Creates a copy of the material once for this renderer
myRenderer.material.color = Color.red;
// vs.
// Retains instancing capability for renderer
m_PropertyBlock.SetColor("_Color", Color.red);
myRenderer.SetPropertyBlock(m_PropertyBlock);
}
Unity-Leistungstools
Unity bietet hervorragende Leistungstools, die in den Editor integriert sind.
Wenn Sie den groben Leistungskonflikt zwischen einem Shader und einem anderen abschätzen, ist es nützlich, jeden Shader zu kompilieren und die Anzahl der Vorgänge pro Shaderstufe anzuzeigen. Dazu können Sie ein Shaderobjekt auswählen und auf die Schaltfläche Kompilieren und Code anzeigen klicken. Dadurch werden alle Shadervarianten kompiliert und Visual Studio mit den Ergebnissen geöffnet. Hinweis: Die generierten statistischen Ergebnisse können je nachdem variieren, welche Features für Materialien aktiviert wurden, die den angegebenen Shader verwenden. Unity kompiliert nur die Shadervarianten, die direkt im aktuellen Projekt verwendet werden.
Unity Standard Beispiel für Shaderstatistiken
Beispiel für eine MRTK-Standard-Shaderstatistik
Siehe auch
Einheit
- Unity-Leistungsoptimierung für Einsteiger
- Tutorials zur Leistungsoptimierung in Unity
- Bewährte Methoden für die Unity-Optimierung
- Optimieren der Grafikleistung
- Praktischer Leitfaden zur Optimierung mobiler Geräte
Windows Mixed Reality
- Empfohlene Einstellungen für Unity
- Grundlegendes zur Leistung für Mixed Reality
- Leistungsempfehlungen für Unity
- Leitfaden zur Ereignisablaufverfolgung für Windows Unity