Bewährte Methoden für die openxr-AppOpenXR app best practices

Ein Beispiel für die unten aufgeführten bewährten Methoden finden Sie in der Datei "openxrprogram. cpp" von basicxrapp.You can see an example of the best practices below in BasicXrApp's OpenXRProgram.cpp file. Die Run ()-Funktion am Anfang erfasst einen typischen openxr-App-Codefluss von der Initialisierung zur Ereignis-und Renderingschleife.The Run() function at the beginning captures a typical OpenXR app code flow from initialization to the event and rendering loop.

Bewährte Methoden für die visuelle Qualität und StabilitätBest practices for visual quality and stability

Die bewährten Methoden in diesem Abschnitt beschreiben, wie Sie die beste visuelle Qualität und Stabilität in jeder openxr-Anwendung erzielen.The best practices in this section describe how to get the best visual quality and stability in any OpenXR application.

Weitere Leistungs Empfehlungen für hololens 2 finden Sie weiter unten im Abschnitt bewährte Methoden für die Leistung auf hololens 2 .For further performance recommendations specific to HoloLens 2, see the Best practices for performance on HoloLens 2 section below.

Gamma-korrektes RenderingGamma-correct rendering

Um sicherzustellen, dass die Renderingpipeline Gamma-correct ist, muss darauf geachtet werden.Care must be taken to ensure that your rendering pipeline is gamma-correct. Beim Rendern in eine vorhandenes SwapChain sollte das Renderziel-Ansichts Format dem vorhandenes SwapChain-Format entsprechen (z. b. DXGI_FORMAT_B8G8R8A8_UNORM_SRGB für das vorhandenes SwapChain-Format und die renderzielansicht).When rendering to a swapchain, the render-target view format should match the swapchain format (e.g. DXGI_FORMAT_B8G8R8A8_UNORM_SRGB for both the swapchain format and the render-target view). Die Ausnahme besteht darin, dass die Renderingpipeline der App eine manuelle sRGB-Konvertierung in Shader-Code durchführt. in diesem Fall sollte die APP ein sRGB-vorhandenes SwapChain-Format anfordern, aber das lineare Format für die renderzielansicht verwenden (z. b. Anforderung DXGI_FORMAT_B8G8R8A8_UNORM_SRGB als vorhandenes SwapChain-Format, aber DXGI_FORMAT_B8G8R8A8_UNORM als renderzielansicht).The exception is if the app's rendering pipeline does a manual sRGB conversion in shader code, in which case the app should request an sRGB swapchain format but use the linear format for the render-target view (e.g. request DXGI_FORMAT_B8G8R8A8_UNORM_SRGB as the swapchain format but use DXGI_FORMAT_B8G8R8A8_UNORM as the render-target view) to prevent content from being double-gamma corrected.

Tiefen Puffer für Projektions Ebenen übermittelnSubmit depth buffer for projection layers

Verwenden Sie immer XR_KHR_composition_layer_depth Erweiterung, und übermitteln Sie den tiefen Puffer mit der Projektionsebene, wenn Sie einen Frame an xrEndFramesenden.Always use XR_KHR_composition_layer_depth extension and submit the depth buffer together with the projection layer when submitting a frame to xrEndFrame. Dies verbessert die Stabilität des Hologramms durch die Aktivierung der neuprojektion von Hardware auf hololens 2.This improves hologram stability by enabling hardware depth reprojection on HoloLens 2.

Auswählen eines angemessenen tiefen BereichsChoose a reasonable depth range

Bevorzugen Sie einen engeren tiefenbereich, um den Bereich der virtuellen Inhalte so zu gestalten, dass Sie die – Hologramm-Stabilität auf hololensPrefer a narrower depth range to scope the virtual content to help hologram stability on HoloLens. Beispielsweise verwendet das openxrprogram. cpp-Beispiel 0,1 bis 20 Meter.For example, the OpenXrProgram.cpp sample is using 0.1 to 20 meters. Verwenden Sie umgekehrtes-Z für eine einheitlichere tiefen Auflösung.Use reversed-Z for a more uniform depth resolution. Beachten Sie, dass bei hololens 2 die Verwendung des bevorzugten DXGI_FORMAT_D16_UNORM tiefen Formats dazu beiträgt, eine bessere Framerate und-Leistung zu erzielen, obwohl 16-Bit-Tiefen Puffer weniger Tiefe Auflösung als 24-Bit-Tiefen Puffer bieten.Note that, on HoloLens 2, using the preferred DXGI_FORMAT_D16_UNORM depth format will help achieve better frame rate and performance, although 16-bit depth buffers provide less depth resolution than 24-bit depth buffers. Daher ist es wichtiger, diese bewährten Methoden zu befolgen, um die Tiefe Auflösung optimal zu nutzen.Therefore, following these best practices to make best use of the depth resolution becomes more important.

Vorbereiten für verschiedene Umgebungs-Blend-ModiPrepare for different environment blend modes

Wenn Ihre Anwendung auch auf immersiven Headsets ausgeführt werden soll, die die Welt vollständig blockieren, stellen Sie sicher, dass Sie unterstützte Umgebungs-Blend-Modi mithilfe xrEnumerateEnvironmentBlendModes-API auflisten und ihren Renderinginhalt entsprechend vorbereiten.If your application will also run on immersive headsets that completely block out the world, be sure to enumerate supported environment blend modes using xrEnumerateEnvironmentBlendModes API, and prepare your rendering content accordingly. Für ein System mit XR_ENVIRONMENT_BLEND_MODE_ADDITIVE z. b. hololens sollte die APP beispielsweise transparent als Klartext verwenden. bei einem System mit XR_ENVIRONMENT_BLEND_MODE_OPAQUEsollte die APP jedoch eine nicht transparente Farbe oder einen virtuellen Raum im Hintergrund darstellen.For example, for a system with XR_ENVIRONMENT_BLEND_MODE_ADDITIVE such as the HoloLens, the app should use transparent as the clear color, while for a system with XR_ENVIRONMENT_BLEND_MODE_OPAQUE, the app should render some opaque color or some virtual room in the background.

Nicht begrenzten Verweis Raum als Stamm Bereich der Anwendung auswählenChoose unbounded reference space as application's root space

Anwendungen stellen in der Regel einen bestimmten Stamm Koordinaten Bereich zum Verbinden von Sichten, Aktionen und holograms her.Applications typically establish some root world coordinate space to connect views, actions and holograms together. Verwenden Sie XR_REFERENCE_SPACE_TYPE_UNBOUNDED_MSFT, wenn die Erweiterung für die Einrichtung eines weltweiten Koordinatensystemsunterstützt wird. Dadurch kann Ihre APP unerwünschte – Hologramm-Abweichungen vermeiden, wenn sich der Benutzer weit entfernt (z. b. 5 Meter entfernt), von wo aus die APP gestartet wird.Use XR_REFERENCE_SPACE_TYPE_UNBOUNDED_MSFT when the extension is supported to establish a world-scale coordinate system, enabling your app to avoid undesired hologram drift when the user moves far (e.g. 5 meters away) from where the app starts. Verwenden Sie XR_REFERENCE_SPACE_TYPE_LOCAL als Fall Back, wenn die unbeschränkte Speicherplatz Erweiterung nicht vorhanden ist.Use XR_REFERENCE_SPACE_TYPE_LOCAL as a fallback if the unbounded space extension doesn't exist.

– Hologramm mit räumlichem Anker verknüpfenAssociate hologram with spatial anchor

Wenn Sie einen ungebundenen Verweis Bereich verwenden, können Hologramme, die Sie direkt in diesem Verweis Bereich platzieren, abweichen, wenn der Benutzer zu den entfernten Räumen geht und dann zurückkehrt.When using an unbounded reference space, holograms you place directly in that reference space may drift as the user walks to distant rooms and then comes back. Für – Hologramm-Benutzer, die sich an einem diskreten Ort auf der Welt befinden, erstellen Sie mithilfe der xrCreateSpatialAnchorSpaceMSFT Erweiterungs Funktion einen räumlichen Anker und positionieren das – Hologramm an seinem Ursprung.For hologram users place at a discrete location in the world, create a spatial anchor using the xrCreateSpatialAnchorSpaceMSFT extension function and position the hologram at its origin. Dadurch bleibt dieses Hologramm im Lauf der Zeit unabhängig.That will keep that hologram independently stable over time.

Unterstützen der Erfassung gemischter RealitätSupport mixed reality capture

Obwohl die primäre Anzeige von hololens 2 die Additive Umgebungs Mischung verwendet, wird der Renderinginhalt der APP mit dem Videodaten Strom der Umgebung in Alpha gemischt gemischt, wenn der Benutzer die gemischte Reality-Erfassunginitiiert.Although HoloLens 2's primary display uses additive environment blending, when the user initiates mixed reality capture, the app's rendering content will be alpha-blended with the environment video stream. Um die beste visuelle Qualität in gemischten Reality-Erfassungs Videos zu erzielen, empfiehlt es sich, die XR_COMPOSITION_LAYER_BLEND_TEXTURE_SOURCE_ALPHA_BIT im layerFlagsder Projektionsebene festzulegen.To achieve the best visual quality in mixed reality capture videos, it's best to set the XR_COMPOSITION_LAYER_BLEND_TEXTURE_SOURCE_ALPHA_BIT in your projection layer's layerFlags.

Bewährte Methoden für die Leistung in hololens 2Best practices for performance on HoloLens 2

Als mobiles Gerät mit Unterstützung für die Hardware neuprojektion haben hololens 2 strengere Anforderungen, um eine optimale Leistung zu erzielen.As a mobile device with hardware reprojection support, HoloLens 2 has stricter requirements to obtain optimal performance. Es gibt eine Reihe von Möglichkeiten, Kompositions Daten über xrEndFrame zu senden, was zu einer Nachbearbeitung führt, die eine spürbare Leistungseinbußen verursachen wird.There are a number of ways to submit composition data through xrEndFrame which will result in post-processing that will have a noticeable performance penalty.

Wählen Sie ein vorhandenes SwapChain-Format aus.Select a swapchain format

Auflisten Sie die unterstützten Pixel Formate immer mithilfe von xrEnumerateSwapchainFormats, und wählen Sie das erste Farb-und tiefen Pixel Format aus der Laufzeit aus, die die App unterstützt, da die Common Language Runtime die optimale Leistung bevorzugt.Always enumerate supported pixel formats using xrEnumerateSwapchainFormats, and choose the first color and depth pixel format from the runtime that the app supports, because that's what the runtime prefers for optimal performance. Beachten Sie, dass bei hololens 2 DXGI_FORMAT_B8G8R8A8_UNORM_SRGB und DXGI_FORMAT_D16_UNORM in der Regel die erste Wahl ist, eine bessere Renderingleistung zu erzielen.Note, on HoloLens 2, DXGI_FORMAT_B8G8R8A8_UNORM_SRGB and DXGI_FORMAT_D16_UNORM is typically the first choice to achieve better rendering performance. Diese Einstellung kann sich auf einem Desktop-PC unterscheiden, der auf einem Desktop-PC ausgeführt wird, bei dem 24-Bit-Tiefen Puffer weniger Leistungseinbußen aufweisen.This preference can be different on VR headsets running on a Desktop PC, where 24-bit depth buffers have less of a performance impact.

Leistungs Warnung: Wenn Sie ein anderes Format als das primäre vorhandenes SwapChain-Farb Format verwenden, führt dies zur Laufzeit nach der Verarbeitung, was zu einer erheblichen Leistungs Einbuße führt.Performance Warning: Using a format other than the primary swapchain color format will result in runtime post-processing which comes at a significant performance penalty.

Rendern Sie immer mit der empfohlenen Ansichts Konfigurations Breite/-Höhe (recommendedImageRectWidth und recommendedImageRectHeight von XrViewConfigurationView), und verwenden Sie immer xrLocateViews-API, um die empfohlenen Ansichts-, FOV-und anderen Renderingparameter vor dem Rendering abzufragen.Always render with the recommended view configuration width/height (recommendedImageRectWidth and recommendedImageRectHeight from XrViewConfigurationView), and always use xrLocateViews API to query for the recommended view pose, fov, and other rendering parameters before rendering. Verwenden Sie beim Abfragen von Posen und Sichten immer die XrFrameEndInfo.predictedDisplayTime aus dem aktuellen xrWaitFrame-Aufrufs.Always use the XrFrameEndInfo.predictedDisplayTime from the latest xrWaitFrame call when querying for poses and views. Dies ermöglicht hololens das Anpassen des Rendering und die Optimierung der visuellen Qualität für die Person, die die hololens trägt.This allows HoloLens to adjust rendering and optimize visual quality for the person who is wearing the HoloLens.

Verwenden einer einzelnen Projektions SchichtUse a single projection layer

Hololens 2 verfügt über eingeschränkte GPU-Leistung für Anwendungen zum Rendering von Inhalten und einen Hardware-Compositor, der für eine einzelne Projektions Schicht optimiert ist.HoloLens 2 has limited GPU power for applications to render content and a hardware compositor optimized for a single projection layer. Immer eine einzelne Projektions Schicht zu verwenden, kann der Framerate der Anwendung, der – Hologramm-Stabilität und der visuellen Qualität helfen.Always using a single projection layer can help the application's framerate, hologram stability and visual quality.

Leistungs Warnung: Wenn Sie etwas anderes als eine einzelne Schutzschicht übermitteln, führt dies zur Laufzeit nach der Verarbeitung, was zu einer erheblichen Leistungs Einbuße führt.Performance Warning: Submitting anything but a single protection layer will result in runtime post-processing which comes at a significant performance penalty.

Mit Textur Array und VPRT RenderingRender with texture array and VPRT

Erstellen Sie eine xrSwapchain sowohl für Links als auch für rechtsbündig, indem Sie arraySize=2 für Color SwapChain und einen für die Tiefe verwenden.Create one xrSwapchain for both left and right eye using arraySize=2 for color swapchain, and one for depth. Rendering Sie den linken Bereich in Slice 0 und das rechte Auge in Slice 1.Render the left eye into slice 0 and the right eye into slice 1. Verwenden Sie einen Shader mit VPRT und instanzierten Draw-aufrufen für das stereorenrendering zum Minimieren der GPU-Auslastung.Use a shader with VPRT and instanced draw calls for stereoscopic rendering to minimize GPU load. Dadurch wird auch die Optimierung der Laufzeit ermöglicht, um die beste Leistung für hololens 2 zu erzielen.This also enables the runtime's optimization to achieve the best performance on HoloLens 2. Alternativen zur Verwendung eines Textur Arrays, z. b. ein Double-Wide Rendering oder eine separate vorhandenes SwapChain pro Auge, führen zur Laufzeit nach der Verarbeitung, was zu einem erheblichen Leistungsabfall führt.Alternatives to using a texture array, such as double-wide rendering or a separate swapchain per eye, will result in runtime post-processing which comes at a significant performance penalty.

Vermeiden von vier EbenenAvoid quad layers

Anstatt vier Ebenen als Kompositions Ebenen mit XrCompositionLayerQuadzu übermitteln, sollten Sie den Quad-Inhalt direkt in der Projektions-SwapChain-Darstellung ablegen.Rather than submitting quad layers as composition layers with XrCompositionLayerQuad, render the quad content directly into the projection swapchain.

Leistungs Warnung: Das Bereitstellen zusätzlicher Ebenen über eine einzelne Projektions Schicht, wie z. b. Quad-Ebenen, führt zur Laufzeit nach der Verarbeitung, was zu einer erheblichen Leistungs Einbuße führt.Performance Warning: Providing additional layers beyond a single projection layer, such as quad layers, will result in runtime post-processing which comes at a significant performance penalty.