VIVE-LogoVR-Rendering-Leistung
Tuning und Optimierungen

Einführung

Ein optimales VR-Erlebnis auf ressourcenbeschränkter Hardware ist der Schlüssel zu einem reibungslosen und komfortablen Benutzererlebnis. Fällt die Bildrate der Inhaltswiedergabe unter die Bildwiederholfrequenz des Geräts oder ist sie instabil, führt dies zu Bildruckeln, Bewegungskrankheit usw. und beeinträchtigt letztendlich das Benutzererlebnis. Daher ist die Optimierung der Inhaltsleistung für ein angenehmes Erlebnis von entscheidender Bedeutung.
Bevor Sie mit der Leistungsoptimierung beginnen, ist es wichtig zu verstehen, wo die Leistungsengpässe liegen, um eine ineffiziente Optimierung zu vermeiden. Dieses Dokument soll Entwicklern helfen, Leistungsengpässe zu identifizieren und Lösungen zur Behebung der Rendering-Leistungsprobleme anzubieten.
Das Dokument ist in die folgenden Abschnitte gegliedert:

  • Kapitel 2: Engpässe identifizieren – Dieser Abschnitt hilft Entwicklern dabei, die Engpässe zu identifizieren.
  • Kapitel 3 und 4: VIVE Wave- und VIVE OpenXR-Einstellungen – Diese Abschnitte beschreiben spezifische Einstellungen, die die CPU-/GPU-Leistung von VIVE Wave- und OpenXR-Apps beeinträchtigen können. Entwickler können diese Funktionen je nach Leistungsengpässen aktivieren oder deaktivieren, um Verbesserungen zu ermitteln.
  • Kapitel 5: Allgemeine Optimierung – In diesem Abschnitt werden einige allgemeine Optimierungspraktiken und -erfahrungen vorgestellt.

Identifizieren Sie den Engpass

Wenn sich das HMD bewegt und die VR/MR-App Frame-Jitter oder schwarze Ränder usw. aufweist, liegt dies meist an einer schlechten Rendering-Performance. Rendering-Performance-Probleme lassen sich typischerweise in zwei Kategorien einteilen: CPU-gebunden oder GPU-gebunden. Es ist wichtig, die Art der Bindung für Ihre App zu verstehen, um ineffizientes Tuning zu vermeiden.
In diesem Kapitel stellen wir einfache Schritte vor, mit denen Sie schnell feststellen können, wo die Leistungsprobleme liegen.

2.1 Überprüfen Sie die FPS beim Rendern von Inhalten
Zunächst überprüfen wir die FPS des Inhalts, also die Anzahl der Frames, die der Inhalt pro Sekunde rendert. Sie sollte der Bildrate des Displays entsprechen und stabil gehalten werden. Andernfalls kann es zu Frame-Jittern kommen.
Wenn Ihr Anwendungs-SDK VIVE WAVE SDK 6.0.0 oder höher verwendet, können Sie den folgenden ADB-Befehl verwenden, um die FPS zu überprüfen. DK 6.0.0
$adb Logcat -s VRMetric
Sie sehen die folgenden Protokolldaten.
VRMetric:FPS=89.8/89.8,CPU-27/1,GPU=72/3,GpuBd=0,LrCnt=1,2Stag=1,Pstat=2,AQ=1,FOVED=0/0, FSE=1,TWS-2,PT=0(0), RndrBK=0,GLTA=2D,EB=1720×1720
„FPS=89.8/89.8“ Die erste Zahl steht für die FPS des Inhalts, während die zweite Zahl für die Bildrate der Anzeige steht.
Wenn Ihre Wave SDK-Version niedriger als 6.0.0 ist, wird empfohlen, auf die neueste Version zu aktualisieren, um die Rendering-Leistung und andere Optimierungen zu verbessern.
Wenn Ihr Anwendungs-SDK mit VIVE OpenXR erstellt wurde, können Sie den folgenden ADB-Befehl verwenden, um die FPS zu überprüfen.
$adb Logcat -s RENDER_ATW
Sie sehen die folgenden Protokolldaten
RENDER_ATW: [FPS] neue Textur: 90.00
RENDER_ATW: [FPS] R vorhanden: 90.00 Überspringen: 0 317, -0.0155 0.805527, 0.006788)
RENDER_ATW: [FPS] L vorhanden:90.00 überspringen:0 (0.592301, -0.015502, 0.805539, 0.006773)

Die Zahl nach „neue Textur“ stellt die aktuellen FPS des Inhalts dar. Die Zahl nach „R vorhanden“ und „L vorhanden“ stellt die Bildrate der Anzeige dar.
Manchmal kann es zu leichten Abweichungen zwischen den Inhalts-FPS und der Bildrate der Anzeige kommen.
Zum BeispielampDas heißt, im obigen Fall können 89.8 FPS als 90 FPS betrachtet werden.
Wenn die FPS des App-Inhalts dauerhaft niedriger ist als die Bildrate des Displays oder instabil bleibt, deutet dies auf ein Problem mit der Rendering-Leistung hin. Daher besteht der nächste Schritt darin, zu ermitteln, ob der Engpass von der CPU oder der GPU verursacht wird.
2.2 CPU- und GPU-Auslastung prüfen
Wenn Ihr Anwendungs-SDK VIVE WAVE SDK 6.0.0 oder höher verwendet, können Sie die FPS mit dem folgenden ADB-Befehl überprüfen.
$adb logcat -s VRMetric
Sie sehen die folgenden Protokolldaten.
VRMetric:FPS=89.8/89.8,CPU=27/1,GPU=72/3,GpuBd=0,LrCnt=1,2Stag=1,Pstat=2,AQ=1,FOVED=0 /0, FSE=1,TWS=2,PT=0(0),RndrBK=0,GLTA=2D,EB=1720×1720
Wie Sie im obigen Protokollergebnis sehen können, beträgt die CPU-Auslastung 27 % und die GPU-Auslastung 72 %. Wenn Ihre Wave SDK-Version unter 6.0.0 liegt, wird empfohlen, auf die neueste Version zu aktualisieren, um die Rendering-Leistung und andere Optimierungen zu verbessern.
Für die VIVE OpenXR-App können Sie den folgenden Befehl verwenden, um die CPU- und GPU-Auslastung zu überprüfen.
# unter Linux/Ubuntu
$ adb logcat | grep CPU_USAGE
# auf Powershell
$ adb logcat | Select-String -Pattern CPU_USAGE
Sie sehen das folgende Protokoll
CPU Durchschnitt CPU0 CPU1 CPU2 CPU3 CPU4 CPU5 CPU6 CPU7 GPU CPU_USAGE [LOAD] 25.67 % 32.22 % 25.29 % 30.77 % 29.35 % 21.35 % 22.09 % 18.39 % 24.14 % 73 %
Wenn Sie feststellen, dass die FPS die Bildrate des Displays nicht halten können und die GPU-Auslastung ebenfalls sehr hoch ist (typischerweise über 85%), können Sie versuchen, die Eyebuffer-Auflösung (Abschnitt 3.1.2, Abschnitt 4.1.2) anzupassen, um zu sehen, ob sich die FPS dadurch verbessern. Wenn diese Anpassung zu besseren
Wenn wir die Leistung beeinträchtigen, können wir davon ausgehen, dass das Problem an die GPU gebunden ist, und unsere Optimierungsbemühungen entsprechend konzentrieren.
Wenn andererseits die Anpassung der Eyebuffer-Auflösung nicht zu einer spürbaren Leistungsverbesserung führt, liegt der Engpass wahrscheinlich an der CPU und wir sollten uns auf die Optimierung der CPU-Leistung konzentrieren.
Es ist auch möglich, dass die Anwendung gleichzeitig CPU- und GPU-lastig ist. In solchen Fällen sollten Optimierungsmaßnahmen sowohl auf der CPU als auch auf der GPU durchgeführt werden, um ausgewogene Leistungsverbesserungen zu erzielen.
2.3 GPU-gebunden
Wenn eine VR-App GPU-gebunden ist, stellt die GPU den Hauptengpass dar und kann die Rendering-Anforderungen der Anwendung nicht erfüllen. Um GPU-gebundene Probleme zu minimieren, beachten Sie die folgenden Empfehlungen:
Verwenden Sie zunächst Profilierungstools wie RenderDoc oder Game Engine Profiler (Unity Profiler, Unreal Insights), um zu analysieren, wo die GPU die meiste Zeit verbringt. Identifizieren Sie die kostenintensivsten Vorgänge und konzentrieren Sie sich auf deren Optimierung.
Für Native Developer können Sie RenderDoc verwenden, um zu ermitteln, welcher Draw Call eine übermäßige GPU-Auslastung verursacht.
Als Unity-Entwickler können Sie diesem Unity-Dokument folgen oder RenderDoc verwenden, um Probleme mit der Rendering-Leistung zu analysieren. Außerdem können Sie der Unity-Dokumentation zur Grafikoptimierung folgen, um Anleitungen zur Optimierung Ihrer Anwendung zu erhalten.
Für Unreal Developer können Sie GPU Visualizer oder RenderDoc verwenden, um Probleme mit der Rendering-Leistung zu analysieren, und den Unreal Performance Guidelines folgen, um Anleitungen zur Optimierung Ihrer Anwendung zu erhalten.
Zweitens können Sie auch versuchen, bestimmte Wave-Funktionen oder -Einstellungen anzupassen, um die GPU-Auslastung zu reduzieren.

  1. Stellen Sie die Bildwiederholfrequenz langsamer ein (Abschnitt 3.1.1, Abschnitt 4.1.1)
  2.  Eyebuffer-Auflösung anpassen (Abschnitt 3.1.2, Abschnitt 4.1.2), 14.1.1)
  3.  Versuchen Sie, Foveation zu aktivieren (Abschnitt 3.1.4, Abschnitt 4.1.4).

Wenn Ihre App auch eine MR-App ist, können Sie auch die Passthrough-Einstellungen anpassen.

  1. Passen Sie die Passthrough-Bildqualität niedriger an. (Abschnitt 3.2.1)
  2. Passen Sie die Passthrough-Framerate langsamer an. (Abschnitt 3.2.2).

Weitere Einstellungen zur GPU-Leistung finden Sie in Kapitel 2.6.

2.4 CPU-gebunden
Wenn eine VR-App CPU-gebunden ist, bedeutet dies, dass die CPU der primäre Engpass ist. Beachten Sie die folgenden Empfehlungen:
Verwenden Sie zunächst Profiling-Tools wie Systrace oder Game Engine Profiler (Unity Profiler, Unreal Insights), um zu analysieren und zu identifizieren, welche Teile Ihres Codes die meisten CPU-Ressourcen verbrauchen. Konzentrieren Sie sich auf die Optimierung dieser Bereiche und refaktorieren Sie rechenintensive Algorithmen, um die CPU-Auslastung zu reduzieren.

  • Für Native Developer können Sie Systrace verwenden, umfilefür Ihr Projekt.
  • Für Unity Developer können Sie CPU Usage Pro verwendenfiler-Modul, um CPU-Leistungsprobleme zu finden.
  • Als Unreal-Entwickler können Sie Unreal Insights verwenden, um CPU-Leistungsprobleme zu finden.

Zweitens können Sie auch versuchen, bestimmte Wave-Funktionen oder -Einstellungen anzupassen, um die GPU-Auslastung zu reduzieren.

  1. Stellen Sie die Bildwiederholfrequenz langsamer ein (Abschnitt 3.1.1, Abschnitt 4.1.1)
  2.  Verwenden Sie Multi-View Rendering (Abschnitt 3.1.4, Abschnitt 4.1.4)

Wenn Ihre App auch eine MR-App ist, können Sie auch die Passthrough-Einstellungen anpassen.

  1. Passen Sie die Passthrough-Framerate langsamer an (Abschnitt 3.2.2).

Weitere Einstellungen zur CPU-Leistung finden Sie in Kapitel 2.6.

2.5 Zusammenfassung
Abschließend haben wir den oben beschriebenen Workflow zur Leistungsüberprüfung in Abbildung 2-5-1 zusammengefasst. Überprüfen Sie zunächst die FPS des Inhalts. Wenn diese niedriger als die Bildrate des Displays ist oder instabil bleibt, analysieren Sie die GPU-/CPU-Auslastung, um festzustellen, ob sie GPU- oder CPU-gebunden ist. Verwenden Sie abschließend einen professionellenfiler, um potenzielle Leistungsprobleme zu identifizieren oder Wave-Funktionen oder -Einstellungen anzupassen, um die CPU-Leistung zu optimieren.

VIVE VR-Rendering-Leistung – Abb. 1

2.6 Kurzübersicht Welche Einstellungen können die CPU/GPU-Auslastung verbessern

Listen Sie die SDK-Einstellungen zur CPU-/GPU-Auslastung wie unten aufgeführt auf. Sie können die entsprechenden Optimierungseinstellungen anhand des Engpasses der App überprüfen.

Bezogen auf CPU:

  • VIVE Wave SDK-Einstellung
    o VR-Inhalte
    ▪ 3.1.1 Bildwiederholfrequenz
    ▪ 3.1.4 Mehr-View Rendern
    ▪ 3.1.6 Adaptive Qualität
    ▪ 3.1.7 Adaptiver Motion Compositor
    o MR-Inhalt
    ▪ 3.2.2 Passthrough-Bildrate anpassen
  • VIVE OpenXR SDK-Einstellung
    o VR-Inhalte
    ▪ 4.1.1 Bildwiederholfrequenz
    ▪ 4.1.4 Mehr-View Rendern
  • Gemeinsame Optimierung
    o 5.5 CPU-Spitze

Bezogen auf GPU:

  • VIVE Wave SDK-Einstellung
    o VR-Inhalte
    ▪ 3.1.1 Bildwiederholfrequenz
    ▪ 3.1.2 Eyebuffer-Auflösung
    ▪ 3.1.3 Mehr-View Rendern
    ▪ 3.1.4 Foveation
    ▪ 3.1.5 Bildschärfeverbesserung (FSE)
    ▪ 3.1.6 Adaptive Qualität
    ▪ 3.1.7 Adaptiver Motion Compositor
    ▪ 3.1.8 Rendermaske [Unreal wird nicht unterstützt] o MR-Inhalt
    ▪ 3.2.1 Passen Sie die Passthrough-Qualität an
    ▪ 3.2.2 Passthrough-Bildrate anpassen
  • VIVE OpenXR SDK-Einstellung
    o VR-Inhalte
    ▪ 4.1.1 Bildwiederholfrequenz
    ▪ 4.1.2 Eyebuffer-Auflösung
    ▪ 4.1.3 Mehr-View Rendern
    ▪ 4.1.4 Foveation [Unreal wird nicht unterstützt] ▪ 4.1.5 Rendermaske [Unreal wird nicht unterstützt]
  • Gemeinsame Optimierung
    o 5.1 Hochleistungsmodus ausschalten
    o 5.2 MultisampLeng
    o 5.3 GMEM Laden/Speichern
    o 5.4 Kompositionsebene (Multi-Layer)

VIVE Wave-Einstellung

VIVE Wave ist eine offene Plattform und ein Toolset, mit dem Sie VR-Inhalte einfach entwickeln und leistungsstarke Geräteoptimierung für Drittanbieter bereitstellen können. VIVE Wave unterstützt die Spiele-Engines Unity und Unreal.
Wir optimieren und beheben kontinuierlich verschiedene Fehler. Daher empfehlen wir, das SDK auf dem neuesten Stand zu halten.
VIVE Wave unterstützt derzeit nur OpenGL ES. Hier sind die Funktionen aufgelistet, sortiert nach ihrem Einfluss auf die GPU-Leistung. Wir unterteilen sie in zwei Bereiche: VR-Inhalte und MR-Inhalte.
3.1 VR-Inhalte
3.1.1 Bildwiederholfrequenz

Higher refresh rates offer smoother visuals, but come at the cost of increased system load. Conversely, lower refresh rates reduce system load, but result in less smooth visuals. If App has CPU/GPU bound issue, you can try decreasing the display refresh rate to alleviate the issue.

  • Native Entwickler finden Informationen unter WVR_SetFrameRate.
  • Unity-Entwickler finden weitere Informationen in diesem Handbuch.
  • Unreal-Entwickler finden in diesem Handbuch weitere Informationen.

3.1.2 Eyebuffer-Auflösung
Die Eyebuffer-Auflösung ist die Texturgröße, die die Inhalts-App rendern soll. Die gerenderte Textur wird an die Laufzeit übermittelt, um den Veröffentlichungsprozess durchzuführen und auf dem HMD-Display anzuzeigen.
Ein größerer Augenpuffer kann zwar zu klareren und detaillierteren Bildern führen, belastet aber auch die GPU erheblich. Daher ist es wichtig, das richtige Gleichgewicht zwischen Bildqualität und Leistung zu finden.
If App has GPU bound issue, you can try decreasing the eyebuffer size by multiply a scale factor. Howerver, we recommend not reducing the scale factor below 0.7, as this may result in unacceptable visual quality.

  • Native Entwickler finden weitere Informationen unter WVR_ObtainTextureQueue. Beim Anpassen der Größe sollten Sie Breite und Höhe mit einem bestimmten Verhältnis multiplizieren.
  • Informationen für Unity-Entwickler finden Sie unter WaveXRSettings.
    Alternativ können Sie Änderungen über den unten stehenden Code vornehmen.
    XRSettings.eyeTextureResolutionScale = ResolutionScaleValue; // C#
  • Informationen für Unreal-Entwickler finden Sie unter SetPixelDensity.

3.1.3 Mehr-View Rendern
Beim traditionellen Rendering zeichnen wir das linke und rechte Auge separat, was zwei Draw Calls für dieselbe Szene erfordert. Multi-View Beim Rendering wird dieses Problem durch die Ausführung nur eines Zeichenaufrufs behoben.
This feature reduces CPU load by decreasing the number of draw calls. The GPU also has some benefits, vertex shader’s workload is also reduced as it doesn’t need to run an additional shader for the other eye, but the fragment shader’s workload remains  unchanged since it still needs to evaluate each pixel for both eyes. We recommand enabling this feature.

  • Für Native-Entwickler können Sie sich auf wvr_native_hellovr s beziehenample.
  • Für Unity-Entwickler: Siehe Render-Modus, Single-Pass ist Multi-view Besonderheit.
  • Unreal-Entwickler finden in diesem Handbuch weitere Informationen.

3.1.4 Foveation
Foveated Rendering ist in erster Linie darauf ausgelegt, die GPU-Last zu reduzieren. Es reduziert die Bilddetails im Randbereich des Displays und behält die hohe Auflösung in der Mitte des Bildfeldes bei. view. Wenn die App ein GPU-gebundenes Problem hat, können Sie versuchen, das Foveation-Rendering zu aktivieren.

VIVE VR-Rendering-Leistung – Abb. 2

Bei der Anwendung der Foveation gibt es einiges zu beachten:

➢ Benutzer bemerken die reduzierte Detailgenauigkeit in peripheren Regionen im Standard-Foveationsmodus normalerweise nicht. Ist die periphere Foveationsqualität jedoch zu niedrig eingestellt, kann dies für den Benutzer erkennbar sein.
➢ Die Foveation-Effekte können bei bestimmten Materialien oder Texturen stärker ausgeprägt sein und die Aufmerksamkeit des Benutzers erregen. Entwickler sollten sich dessen bewusst sein und es entsprechend bewerten.
➢ Die Aktivierung der fovealen Rendering-Funktion verursacht einen fixen GPU-Leistungsverlust, der je nach Größe des Augenpuffers zwischen 1 % und 6 % variieren kann. Bei Verwendung eines einfachen Shaders in der Szene kann der Leistungsgewinn durch Ressourceneinsparungen geringer sein als der fixe GPU-Leistungsverlust, was zu einem Leistungsabfall führt.

  • Native Entwickler finden weitere Informationen in diesem Handbuch.
  • Unity-Entwickler finden weitere Informationen in diesem Handbuch. Insbesondere bei aktivierter Nachbearbeitung oder HDR kann Foveation nicht vollständig genutzt werden. Unity rendert Objekte auf seiner eigenen generierten Rendertextur und nicht auf der zur Laufzeit generierten Rendertextur, die Foveation unterstützt.
  • Für Unreal-Entwickler siehe diese Anleitung. Insbesondere kann Foveation auf Multi-View Rendering, da Unreal Objekte nicht direkt auf der zur Laufzeit generierten Rendertextur rendern kann, die Foveation unterstützt.

3.1.5 Bildschärfeverbesserung (FSE)
Der FSE sorgt durch die Einführung eines Schärfungsfilters für ein schärferes Rendering-Ergebnis. Er kann Inhalte klarer darstellen und die Textschärfe in der Szene verbessern. Bei GPU-Problemen der App können Sie FSE deaktivieren, sofern dies nicht unbedingt erforderlich ist.

VIVE VR-Rendering-Leistung – Abb. 3

  • Native Entwickler finden weitere Informationen in diesem Handbuch.
  • Unity-Entwickler finden weitere Informationen in diesem Handbuch.
  • Unreal-Entwickler finden in diesem Handbuch weitere Informationen.

3.1.6 Adaptive Qualität
Um den Akku zu schonen und die Rendering-Leistung des Geräts aufrechtzuerhalten, passt diese Funktion die Leistungsstufen der CPU-/GPU-Taktung automatisch an die jeweilige Nutzung an. Darüber hinaus können weitere Strategien zur Leistungssteigerung implementiert werden, z. B. das automatische Aktivieren/Deaktivieren von Foveation oder die automatische Anpassung des Inhalts bei hoher/niedriger Auslastung.

  • Native Entwickler finden weitere Informationen in diesem Handbuch.
  • Unity-Entwickler finden in diesem Handbuch weitere Informationen. In unserem Unity-Plugin kann die Größe des Augenpuffers automatisch an die aktuelle Leistung angepasst werden. Die Textgröße filtert zu kleine Skalenwerte in der Auflösungsliste heraus. Wir empfehlen eine Textgröße von mindestens 20 dmm oder größer.
  • Unreal-Entwickler finden in diesem Handbuch weitere Informationen.

3.1.7 Adaptiver Motion Compositor
Diese Funktion ist experimentell und umfasst UMC und PMC. UMC reduziert die Bildrate um die Hälfte und extrapoliert neue Bilder in Echtzeit, um die visuelle Darstellung zu gewährleisten. Allerdings kommt es dabei zu Latenz, Artefakten und GPU-Belastung.
PMC nutzt primär den Tiefenpuffer, um ATW die HMD-Übersetzung zu ermöglichen und eine 6-Dof-Kompensation zu ermöglichen. Diese Funktion kann die Übersetzungslatenz um 1–2 Frames reduzieren, erhöht aber die GPU-Auslastung.

  • Native Entwickler finden weitere Informationen in diesem Handbuch.
  • Unity-Entwickler finden weitere Informationen in diesem Handbuch.
  • Unreal-Entwickler finden in diesem Handbuch weitere Informationen.

3.1.8 Rendermaske [Unreal wird nicht unterstützt]
Pixel an den Rändern werden nach der Verzerrung nahezu unsichtbar. Die Rendermaske modifiziert die Tiefenpufferwerte dieser unsichtbaren Pixel. Wenn Sie die Tiefenprüfung aktivieren, werden diese unsichtbaren Pixel aufgrund von Early-Z nicht gerendert, wodurch die GPU-Auslastung reduziert wird. Diese Funktion ist nützlich, wenn sich in diesen unsichtbaren Bereichen stark belastende Rendering-Objekte befinden. Andernfalls, wenn sich in diesen Bereichen keine Rendering-Objekte befinden, wird empfohlen, sie zu deaktivieren, da sie nur eine geringe GPU-Auslastung verursacht.

  • Native Entwickler finden weitere Informationen in diesem Handbuch. Sie müssen den Tiefenpuffer vor dem Aufruf von RenderMask binden, da dies sonst wirkungslos ist.
  • Unity-Entwickler finden weitere Informationen in diesem Handbuch.
  • Für Unreal-Entwickler: Die Rendermaskenfunktion wird derzeit nicht unterstützt.

3.2 MR-Inhalt
3.2.1 Passen Sie die Passthrough-Qualität an
Es gibt 3 Stufen für die Passthrough-Bildqualität:
➢ WVR_PassthroughImageQuality_DefaultMode – geeignet für MR-Inhalte ohne besondere Anforderungen.
➢ WVR_PassthroughImageQuality_PerformanceMode – geeignet für MR-Inhalte, die mehr GPU-Ressourcen für das Rendern virtueller Szenen benötigen.
➢ WVR_PassthroughImageQuality_QualityMode – geeignet für MR-Inhalte, die es den Benutzern ermöglichen, die Umgebung klar zu sehen, aber die virtuelle Szene des Inhalts muss für eine bessere Leistung feiner abgestimmt werden.
Sie können die Passthrough-Qualität auf PerformanceMode einstellen, um die GPU-Auslastung zu reduzieren.

  • Native-, Uunity- oder Unreal-Entwickler finden weitere Informationen in diesem Handbuch.

3.2.2 Passen Sie die Passthrough-Bildrate an
Wie die Bildwiederholfrequenz des Displays bietet eine höhere Passthrough-Bildrate eine flüssigere Darstellung, geht aber mit einer höheren Systemlast einher. Umgekehrt reduzieren niedrigere Bildwiederholfrequenzen die Systemlast, führen aber zu einer weniger flüssigen Darstellung. Es gibt zwei Modi für die Passthrough-Bildrate: Boost und Normal.

  • Native Entwickler können die Passthrough-Qualität mit WVR_SetPassthroughImageRate anpassen.
  • Für Unity-Entwickler: Änderungen per Code möglich, z. B.ampDie Dateieinstellungen sind wie folgt // C#
    Interop.WVR_SetPassthroughImageQuality(WVR_PassthroughImageQuality.PerformanceMode);
  • Informationen zur Einstellungsmethode für Unreal-Entwickler finden Sie im Blueprint-Knoten in Abbildung 3-2-2.

VIVE VR-Rendering-Leistung – Abb. 4

VIVE OpenXR-Einstellung

OpenXR ist ein offener Standard der Khronos Group, der einen gemeinsamen Satz von APIs für die Entwicklung von XR-Anwendungen bietet, die auf einer Vielzahl von VR-Geräten laufen. VIVE Focus 3 und VIVE XR Elite unterstützen ebenfalls OpenXR. Das VIVE OpenXR SDK bietet umfassende Unterstützung für HTC VR-Geräte und ermöglicht Entwicklern die Erstellung von All-in-One-Inhalten und Inhalten mit Unity und Unreal Engine auf HTC VR-Geräten. Wir optimieren und beheben kontinuierlich verschiedene Fehler. Daher wird Entwicklern empfohlen, die FOTA-Version ihres Geräts zu aktualisieren, um es auf dem neuesten Stand zu halten. Aktuell unterstützt das VIVE OpenXR SDK OpenGL ES und Vulkan.

4.1 VR-Inhalte
4.1.1 Bildwiederholfrequenz
Das Konzept ähnelt hier 3.1.1 Anzeigeaktualisierungsrate.

  • Native Entwickler finden weitere Informationen unter XrEventDataDisplayRefreshRateChangedFB.
  • Unity-Entwickler finden weitere Informationen in diesem Handbuch.
  • Unreal-Entwickler finden in diesem Handbuch weitere Informationen.

4.1.2 Eyebuffer-Auflösung
Das Konzept hier ähnelt 3.1.2 Eyebuffer-Auflösung. Wir empfehlen, den Skalierungsfaktor nicht unter 0.7 zu ​​reduzieren, da dies zu einer inakzeptablen Bildqualität führen kann.

  • Native Entwickler finden weitere Informationen unter xrCreateSwapchain. Beim Anpassen der Größe sollten Sie Breite und Höhe mit einem bestimmten Verhältnis multiplizieren.
  • Informationen für Unity-Entwickler finden Sie im folgenden Beispielample // C#
    XRSettings.eyeTextureResolutionScale = 0.7f; //empfohlen 1.0f~0.7f
  • Informationen zu Unreal-Einstellungen finden Sie in diesem Handbuch.

4.1.3 Mehr-View Rendern
Das Konzept hier ist ähnlich wie 3.1.3 Multi-View Rendering. Diese Funktion reduziert die CPU-Belastung. Auch die GPU bietet einige Vorteile. Wir empfehlen, diese Funktion zu aktivieren.

  • Für Native-Entwickler bietet KhronosGroup eine OpenXR Multi-View example, siehe dieses Handbuch.
  • Für Unity-Entwickler: Siehe Render-Modus, Single-Pass ist Multi-view Besonderheit.
  • Informationen zu Unreal Developer sowie zu den VIVE Wave-Einstellungen finden Sie in diesem Handbuch.

4.1.4 Foveation [Nicht unterstützt Unreal]
Das Konzept hier ähnelt dem von 3.1.4 Foveation. Foveated Rendering ist in erster Linie darauf ausgelegt, die GPU-Last zu reduzieren, aber die Aktivierung verursacht feste GPU-Leistungskosten. Wenn Foveation zu niedrig eingestellt ist und bestimmte Materialien oder Texturen verwendet werden, kann es sehr
für den Benutzer spürbar. Daher ist es ratsam, die Funktion basierend auf Ihren spezifischen Anforderungen und Leistungsüberlegungen zu aktivieren oder zu deaktivieren. Derzeit wird die Foveated-Funktionalität nur in OpenGL ES auf dem VIVE OpenXR SDK unterstützt.

  • Für Native-Entwickler ist diese Funktion verfügbar, aber derzeit kein ExampDateien werden bereitgestellt.
  • Unity-Entwickler finden weitere Informationen in diesem Handbuch.
  • Für Unreal-Entwickler: Diese Funktion wird derzeit nicht unterstützt.

4.1.5 Rendermaske [Unreal wird nicht unterstützt]
Das Konzept ähnelt hier 3.1.8 Render Mask.

  • Native Entwickler verwenden XrVisibilityMaskKHR, um das Mesh abzurufen. Verwenden Sie dieses Mesh, um vor dem Rendern der Szene die Tiefenpufferwerte zu füllen.
  • Für Unity-Entwickler ist die Rendermaskenfunktion für OpenGL ES standardmäßig aktiviert und kann mit dem folgenden Code deaktiviert werden. Vulkan unterstützt diese Funktion derzeit nicht. //C# UnityEngine.XR.XRSettings.occlusionMaskScale = 0.0f;
  • Für Unreal-Entwickler: Die Rendermaskenfunktion wird derzeit nicht unterstützt.

4.2 MR-Inhalt
OpenXR unterstützt derzeit nicht die Einstellung von Passthrough-Qualität und Bildrate. Wir werden die Passthrough-Funktion weiterhin optimieren und reparieren. Entwicklern wird daher empfohlen, die FOTA-Version des Geräts zu aktualisieren, um sie auf dem neuesten Stand zu halten.

Gemeinsame Optimierung

5.1 Hochleistungsmodus deaktivieren
Durch Deaktivieren des „Hochleistungsmodus“ kann die Anzeigegröße des Geräts reduziert und dadurch die GPU-Auslastung verringert werden. Der Nachteil ist eine geringere Bildschirmauflösung. Sie können Qualität und Leistung abwägen, um zu entscheiden, ob Sie den Modus aktivieren möchten.
Der Einstellungsort für VIVE Focus 3 ist in Abbildung 5-1-1 dargestellt:

VIVE VR-Rendering-Leistung – Abb. 5

Der Einstellungsort für VIVE XR Elite ist in Abbildung 5-1-2 dargestellt:

VIVE VR-Rendering-Leistung – Abb. 6

5.2 Multisampling Anti-Aliasing
Multisampling is an anti-aliasing technique used to smooth out jagged edges, usually is accelerated through hardware, which incurs GPU performance cost. We recommend not setting MSAA higher than 2x because more hight value will consume more gpu usage.

  • Für native Entwickler, MSAA OpenGL ES exsample kann sich darauf beziehen; MSAA Vulkan exampler kann sich darauf beziehen.
    Die Adreno GPU bietet eine Erweiterung, die MSAA optimiert.
  • Informationen für Unity-Entwickler finden Sie in dieser Gilde.
  • For Unreal developer, refer to this guild. Unreal also has provide post processing anti-aliasing, refer to this guild.

5.3 GMEM Laden/Speichern
In der Adreno-GPU-Architektur gibt es eine Funktion, die beim Binden eines Renderziels, sofern dieses nicht gelöscht oder ungültig gemacht wird, bei jedem Rendervorgang die Werte im Renderziel in den Grafikspeicher lädt (GMEM-Laden). Werden die vorherigen Werte nicht benötigt, kann das Löschen oder Ungültigmachen des Renderziels vor dem Rendern diese Situation vermeiden und die GPU-Leistung verbessern.
Sie können GMEM Load mit den folgenden Methoden vermeiden. In OpenGL ES können Sie nach dem Binden des FBO glClear und glClearDepth aufrufen, um Farb-, Tiefen- und Schablonenpuffer zu löschen, oder glInvalidateFramebuffer aufrufen, um das angegebene Renderziel ungültig zu machen. In Vulkan sind keine zusätzlichen Anweisungen erforderlich; Sie können in VkAttachmentDescription.loadOp explizit festlegen, ob der Anhang vor der Verwendung gelöscht werden soll.
Das Speichern des Ergebnisses eines Tile-Renderings vom Grafikspeicher zurück in den Hauptspeicher wird als GMEM-Speicherung bezeichnet. Dieser Vorgang ist ebenfalls kostenintensiv für die GPU. Um dies zu vermeiden, empfehlen wir, nur die erforderlichen Renderziele zu binden, um unnötige Speichervorgänge zu vermeiden.

5.4 Kompositionsebene (Mehrschicht)
Mit Multi-Layer dargestellte Texturen haben eine bessere visuelle Qualität. Diese Funktion erhöht jedoch die GPU-Leistung deutlich, abhängig von der Anzahl der Layer und der Größe der Texturen. Wir empfehlen, nicht mehr als drei Layer zu verwenden.

  • Für Native-Entwickler,
    o VIVE Wave SDK verwendet WVR_SubmitFrameLayers, um Daten für jede Ebene zu übergeben.
    o VIVE OpenXR SDK platziert Layer-Daten in XrFrameEndInfo und übermittelt sie über xrEndFrame.
  • Für Unity-Entwickler,
    o VIVE Wave SDK-Einstellungen, siehe diese Anleitung,
    o VIVE OpenXR-Einstellungen, siehe dieses Handbuch.
  • Für Unreal-Entwickler,
    o VIVE Wave SDK-Einstellungen, siehe dieses Handbuch.
    o VIVE OpenXR-Einstellungen, siehe dieses Handbuch.

5.5 CPU-Spitze
Bei hoher CPU-Auslastung können Hintergrundprozesse mit hoher Priorität die native Ausführung unterbrechen. Wir können nicht garantieren, dass die Inhaltsanwendung nicht durch andere Threads unterbrochen wird.
If such issues arise, you can try increasing the thread priority to see if it resolves the problem. But if you change the thread configuration to optimize for devices, you need to check if this has any negative impact.

  • Für Unity-Entwickler siehe die Thread-Konfigurationsfunktion von Android. Wenn Sie das VIVE Wave SDK verwenden, steht Ihnen in WaveXRSettings eine Funktion zur Verfügung, mit der Sie die Priorität anpassen können (siehe Abbildung 5-5-2). Der kleinere Wert steht für eine höhere Priorität.

VIVE VR-Rendering-Leistung – Abb. 7

  • Unreal: Es gibt keine Möglichkeit, die Priorität von Spiel-Threads, Rendering-Threads und RHI-Threads über externe Einstellungen zu ändern, es sei denn, Sie ändern den Engine-Code.

Copyright © 2024 HTC Corporation. Alle Rechte vorbehalten.VIVE-Logo

Dokumente / Ressourcen

VIVE VR-Rendering-Leistung [pdf] Benutzerhandbuch
VR-Rendering-Leistung, Rendering-Leistung, Leistung

Verweise

Hinterlasse einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Pflichtfelder sind markiert *