Dieses Thema betrifft die Oculus Rift-Entwicklung mit dem PC SDK. Informationen über die Optimierung der Leistung für Meta Quest-Apps findest du im jeweiligen Thema für deine Entwicklungsplattform:
In diesem Abschnitt werden die Tools beschrieben, die du zum Ermitteln von Performance-Problemen verwenden solltest.
Hier werden eine Reihe verschiedener Tools zur Performance-Optimierung vorgestellt, um Hinweise zum Workflow zu geben bzw. einen Entscheidungsbaum bereitzustellen, den du bei der Bewertung und Lösung von Problemen befolgen musst. Wenn ein Grafikproblem vorliegt, stürzt deine Anwendung gegebenenfalls ab, du siehst einen schwarzen Bildschirm oder die Performance wird möglicherweise aufgrund hoher Latenzzeiten ausgebremst. Es gibt jedoch viele Bedingungen, die zu ähnlichen Problemen führen können. Daher solltest du die tatsächliche Ursache der auftretenden Symptome ermitteln. Mit den in diesem Abschnitt vorgestellten Tools kannst du große Problemkategorien schnell ausschließen und dann die zugrunde liegenden Probleme ermitteln.
Die folgenden Optimierungstools helfen dir, Performance-Probleme zu isolieren und zu beheben:
Lost Frame Capture
Dieses Tool erfasst Darstellungen aller Frames, die deine Anwendung auslässt, und ermöglicht dir, nur diese Frames zusammen mit Leistungsstatistiken und -diagrammen wiederzugeben. Auf diese Weise kannst du schnell erkennen, wo deine Anwendung die Framerate nicht aufrechterhält. In vielen Fällen reicht dies aus, um das Problem zu identifizieren. Lost Frame Capture ist ein Offline-Analysetool. Du versetzt das Tool in den Aufnahmemodus, führst deine VR-Anwendung aus, stoppst den Aufnahmemodus und überprüfst dann offline den Inhalt der ausgelassenen Frames. Du kannst den erfassten Inhalt auch exportieren, indem du ihn in einer Oculus Debug Archive(ODA)-Datei speicherst. Auf diese Weise kannst du die Daten zu verlorenen Frames problemlos mit anderen teilen, die dann wiederum die Szenarien reproduzieren können, in denen Frames verloren gehen, und so bei der Diagnose der zugrunde liegenden Probleme helfen können. Weitere Informationen findest du unter Lost Frame Capture.
NVIDIA Frame Capture Analysis Tool for VR Games (FCAT VR)
FCAT VR ist ein von NVIDIA bereitgestelltes Tool. Es kann jedoch mit jeder GPU-Hardware verwendet werden. Eine Komponente des FCAT VR Capture-Tools wird auf deinem PC ausgeführt. Es verwendet Event-Tracing-Daten, die von Event Tracing for Windows (ETW) generiert werden. (Der Vorgang zum Erfassen der Event-Tracing-Daten von ETW wird in diesem Leitfaden unter Tutorial: Optimizing a Sample Application (Tutorial: Optimieren einer Beispielanwendung) beschrieben.) Eine zweite Komponente von FCAT VR importiert die von ETW erfassten Event-Tracing-Daten und zeigt Diagramme an, mit denen du Frame-Timing, ausgelassene Frames, verzerrte Frames, synthetisierte Frames (Asynchroner SpaceWarp), Reprojektion und andere Probleme analysieren kannst. Weitere Informationen findest du unter Frame Capture Analysis Tool for VR Games (Frame Capture Analysis Tool für VR-Spiele).
Oculus Debug Tool
Dieses Tool bietet ein Live-Heads-up-Display, das sogenannte Oculus Performance HUD. Diese Informationsanzeige kann dir dabei helfen, Performance-Probleme in bestimmten Kontexten innerhalb deines VR-Erlebnisses in Verbindung zu bringen und in Echtzeit mit diesen Situationen zu experimentieren. Du kannst Statistiken anzeigen, z. B. wie viele Compositor-Frames ausgelassen werden, wie lange die Anwendung oder der Compositor zum Rendern von Frames benötigt usw.
Mit dem Oculus Performance HUD kannst du schnell große Kategorien möglicher Probleme ausschließen, denn du solltest keinen Aufwand in die Verbesserung der Performance einer einzelnen Komponente stecken, die keine Auswirkung auf die Gesamtperformance der Anwendung hat. Wenn deine Anwendung beispielsweise Frames auslässt und das CPU-Profil zu einem bestimmten Zeitpunkt während eines Frame-Zyklus eine starke Auslastung anzeigt, solltest du gar nicht erst Probleme mit der GPU in Betracht ziehen (es sei denn, die CPU wartet auf die GPU).
Sobald du ein solches Problem ermittelst, kannst du wichtige Detailanalysen durchführen, indem du relevante ETW-Traces mit dem Windows Performance Analyzer (WPA) oder mti GPUView analysierst. Angenommen, deine Anwendung ist CPU-gebunden und bleibt bei der Verarbeitung von Physikeffekten und beim Senden von Draw Calls hängen. Auch wenn die Anwendung CPU-gebunden ist, kann sie einen Stack bei der Draw Call-Generierung aufweisen. In diesem Fall solltest du gegebenenfalls mehr Batching einsetzen. Ein Tool wie GPUView kann dir dabei helfen, diese Art von Problem sehr genau einzugrenzen. So weißt du genau, was in deinem Code geändert werden muss. Weitere Informationen findest du unter Oculus Debug Tool und Performance Head-Up Display.
SDK-Statistiken
Du kannst das SDK auch direkt aufrufen, um dieselben Statistiken abzurufen, die im Oculus Performance HUD angezeigt werden, und diese Statistiken dann nach Belieben in deinem Code verwenden. Du kannst beispielsweise bestimmte Statistiken in einen Konsolen-Output schreiben oder einen Debugger aufrufen, wenn eine bestimmte Bedingung eintritt. Weitere Informationen findest du unter SDK Performance Statistics (SDK-Performance-Statistiken).
Performance Profiler
Dieses Analysetool erstellt Diagramme auf Grundlage derselben Arten statistischer Daten, die direkt im SDK und im Oculus Performance HUD verfügbar sind. Du kannst diese Diagramme verwenden, wenn du Muster analysieren möchtest, die sich über einen bestimmten Zeitraum hinweg abspielen. Weitere Informationen findest du unter Performance Profiler.
Event Tracing for Windows (ETW)
ETW ist ein Trace-Dienstprogramm zur Performance-Analyse. Es sammelt Eventdaten, während die VR-Anwendung ausgeführt wird, und speichert diese Daten dann in Event-Trace-Protkolldateien (Event Trace Log, .etl). Die Performance-Analyse mit ETW konzentriert sich auf die vom Windows-Kernel generierten Events, die umfassende Details zum Systembetrieb liefern. ETW erstellt ein Profil des gesamten Systems, nicht nur der GPU. Die vollständige ETW-Dokumentation findest du hier: https://msdn.microsoft.com/de-de/library/windows/desktop/bb968803.
Um die ETW-Traces zu analysieren, solltest du üblicherweise entweder den Windows Performance Analyzer (WPA), GPUView oder beides nutzen.
Windows Performance Analyzer (WPA)
WPA bietet einen Überblick über den Trace-Output, einschließlich Kontextinformationen, die dir helfen, die Systemlast zu verstehen.
Wenn WPA einen Trace lädt, ist die von diesem Trace angezeigte Ansicht eine Hierarchie von Events, die zueinander geführt haben. Du könntest beispielsweise feststellen, dass deine Anwendung zu 90 % der Zeit eine Kamera rendert. Und 90 % dieser Zeit wurden damit verbracht, Büsche zu rendern. Davon entfallen 80 % der Zeit auf das Rendern des Laubes und 30 % der Zeit auf Alpha-Blending. In diesem Beispiel könntest du dich dafür entscheiden, die Schattierungsmethode zu ändern, damit das Alpha-Blending weniger Computerressourcen in Anspruch nimmt. Du kannst davon ausgehen, dass dieser Ansatz die Performance der Anwendung insgesamt verbessern würde.
GPUView
GPUView bietet eine Detailansicht des Trace-Outputs und verfügt nicht über die Kontextinformationen, die WPA bietet. GPUView bietet jedoch Einblicke in die Interaktion zwischen CPU und GPU, die mit WPA nicht möglich sind. Da GPUView keine Kontextinformationen bietet, kann es schwierig sein, bestimmte Punkte im Lebenszyklus deiner Anwendung zu lokalisieren. Du kannst die beiden Tools jedoch ergänzend verwenden. Du kannst beispielsweise mit WPA den relevanten VR-Frame-Index suchen und anhand dessen denselben Frame in GPUView ausfindig machen.
Wenn du Unity oder Unreal verwendest, kannst du die integrierten Profiler nutzen, um die meisten Engpässe zu beheben. Wenn deine Shader beispielsweise zu komplex sind oder deine Skripte zu lange laufen, helfen dir diese Profiler dabei, das Problem aufzuspüren. Wenn deine Anwendung jedoch viele Konflikte und Synchronisierungsprobleme aufweist oder wenn es zu Ruckeln kommt, das nicht durch die Anwendungsauslastung erklärt werden kann, kannst du mit GPUView die Systemwarteschlangen genauer untersuchen. Auf diese Weise kannst du ineffiziente Richtlinien oder schlechte Synchronisierungsmechanismen finden. Wenn du beispielsweise einen zu großen Vertex-Puffer verwendest, kann dies zu Seitenfehlern führen. Die GPU ruft möglicherweise Daten aus dem Systemspeicher ab, was darauf hinweisen könnte, dass deine Meshes zu komplex sind.
GPUView hilft dir bei der Lösung der folgenden Arten von Problemen:
Warum fehlen der Anwendung VSync-Intervalle?
Bremsen neue Oberflächenzuweisungen die GPU aus und verursachen so das Ruckeln der Frames?
Wird die Optimierung des CPU-Codes die Performance verbessern oder musst du die Workload reduzieren, die du an die GPU sendest?
Sendest du Grafikaufgaben früh genug im Frame an die GPU oder ist die GPU im Leerlauf, während sie auf deinen CPU-Code wartet?
ovrlog_win10
Dieses Skript wird verwendet, um ETW-Tracing-Sitzungen auf Windows 10 zu starten und zu stoppen. (Verwende für ältere Windows-Versionen ovrlog.) Der ETW-Trace-Output wird als Input für WPA und GPUView verwendet. Die Skripte ovrlog_win10 und ovrlog rufen das Tool xperf auf, das den Event-Erfassungsvorgang initiiert, Dateipfade einrichtet, alle für Oculus-Anwendungen relevanten Events einfügt und dann das Event-Tracing deaktiviert, wenn der Vorgang abgeschlossen ist.
ovrlog_win10 und ovrlog sind darauf ausgelegt, Events auf Kernel- und Anwendungsebene zu erfassen. Dazu gehören:
Sowohl ovrlog und ovrlog_win10 werden zur Laufzeit bereitgestellt.
Eine VSync (vertikale Synchronisierung) stellt einen Zeitpunkt dar, der jegliche Änderungen am Anzeigespeicher verhindert, bis die Anzeige ihren aktuellen Aktualisierungszyklus abgeschlossen hat. VSyncs sind im Allgemeinen dein wichtigster Anhaltspunkt bei der Optimierung von VR-Anwendungen.
Der typische ovrlog-Workflow sieht wie folgt aus:
Generiere einen ETW-Trace, während die Oculus-Anwendung ausgeführt wird.
Lade die Trace-Datei in WPA und suche den Frame-Index, bei dem das Problem auftritt.
Lade die Trace-Datei in GPUView und suche den VSync für den gewünschten Frame-Index.
Zoome um den Frame-Index herum rein, um beispielsweise ein umgebendes Intervall von zehn Frames anzuzeigen.
Vergleiche den Problem-Frame mit einem nahegelegenen fehlerfreien Frame und untersuche insbesondere, wie die Frames CPU- und GPU-Ressourcen planen.
Ordne die CPU-/GPU-Workload den in deiner Anwendung ausgeführten Funktionen zu (indem du auf die Pakete klickst und so die entsprechende Workload auf Anwendungsebene hervorhebst, die sie ausführen).
Schließe daraus auf die Ursache des Performance-Problems, z. B. einen zu großen Vertex-Puffer.