Best practices voor OpenXR-apps

U kunt een voorbeeld van de onderstaande best practices bekijken in het OpenXRProgram.cpp-bestand van BasicXrApp. Met de functie Run() aan het begin wordt een typische codestroom van de OpenXR-app van de initialisatie naar de gebeurtenis- en renderinglus vast leggen.

Best practices voor visuele kwaliteit en stabiliteit

In de best practices in deze sectie wordt beschreven hoe u de beste visuele kwaliteit en stabiliteit in een OpenXR-toepassing kunt krijgen.

Zie de sectie Best practices for performance on HoloLens 2 (Aanbevolen procedures voor HoloLens 2 prestaties) hieronder voor meer prestatieaanbevelingen die specifiek zijn HoloLens 2 prestaties.

Rendering met de juiste kleuring

Zorg ervoor dat uw renderingpijplijn correct is. Bij het weergeven naar een swapchain moet de weergave-indeling render-target overeenkomen met de indeling van de swapchain. Bijvoorbeeld voor DXGI_FORMAT_B8G8R8A8_UNORM_SRGB zowel de swapchain-indeling als de weergave render-target. Er is een uitzondering als de rendering-pijplijn van de app een handmatige sRGB-conversie in shadercode kan uitvoeren. De app moet een sRGB-swapchain-indeling aanvragen, maar de lineaire indeling gebruiken voor de weergave render-target. Vraag bijvoorbeeld aan als de swapchain-indeling, maar gebruik als de weergave render-target om te voorkomen dat inhoud DXGI_FORMAT_B8G8R8A8_UNORM_SRGBDXGI_FORMAT_B8G8R8A8_UNORM dubbel wordt gecorrigeerd.

Dieptebuffer voor projectielagen indienen

Gebruik altijd XR_KHR_composition_layer_depth de extensie en verzend de dieptebuffer samen met de projectielaag bij het verzenden van een frame naar xrEndFrame . Door het inschakelen van hardwarediepte-reprojectie op HoloLens 2 wordt de stabiliteit van hologrammen verbeterd.

Kies een redelijk dieptebereik

Geef de voorkeur aan een smaller dieptebereik om het bereik van de virtuele inhoud te beperken om de stabiliteit van hologrammen op HoloLens. Het voorbeeld OpenXrProgram.cpp gebruikt bijvoorbeeld 0,1 meter tot 20 meter. Gebruik reversed-Z voor een uniformere diepteresolutie. Op HoloLens 2 helpt het gebruik van de gewenste diepte-indeling om een betere framesnelheid en betere prestaties te bereiken, hoewel 16-bits dieptebuffers een minder diepteresolutie bieden dan DXGI_FORMAT_D16_UNORM 24-bits dieptebuffers. Het volgen van deze best practices om optimaal gebruik te maken van de diepteresolutie wordt steeds belangrijker.

Voorbereiden op verschillende omgevingsmixmodi

Als uw toepassing ook wordt uitgevoerd op immersive headsets die de wereld volledig blokkeren, moet u ondersteunde omgevingsmixmodi opsnoemen met api en uw xrEnumerateEnvironmentBlendModes rendering-inhoud correct voorbereiden. Voor een systeem met zoals de HoloLens moet de app bijvoorbeeld transparant gebruiken als de duidelijke kleur, terwijl voor een systeem met een ondoorzichtige kleur of een virtuele ruimte op de achtergrond moet worden XR_ENVIRONMENT_BLEND_MODE_ADDITIVEXR_ENVIRONMENT_BLEND_MODE_OPAQUE weergegeven.

Kies niet-gebonden referentieruimte als hoofdruimte van de toepassing

Toepassingen brengen doorgaans coördinatenruimte in de hoofdwereld tot stand om weergaven, acties en hologrammen met elkaar te verbinden. Gebruik wanneer de extensie wordt ondersteund om een coördinaatsysteem op wereldschaal in te stellen, zodat uw app ongewenste hologram-drift kan voorkomen wanneer de gebruiker ver weg gaat (bijvoorbeeld 5 meter vanaf het begin van de XR_REFERENCE_SPACE_TYPE_UNBOUNDED_MSFT app). XR_REFERENCE_SPACE_TYPE_UNBOUNDED_MSFT Gebruik XR_REFERENCE_SPACE_TYPE_LOCAL als een terugval als de niet-gebonden ruimte-extensie niet bestaat.

Hologram koppelen aan ruimtelijk anker

Wanneer u een niet-gebonden referentieruimte gebruikt, kunnen hologrammen die u rechtstreeks in die referentieruimte plaatsen, driften wanneer de gebruiker naar afgelegen ruimten loopt en vervolgens terugkomt. Voor hologrammen die gebruikers op een discrete locatie ter wereld plaatsen, maakt u een ruimtelijk anker met behulp van de extensiefunctie en positioneert u het hologram op de oorsprong. Dit hologram blijft dan onafhankelijk stabiel in de tijd.

Ondersteuning voor mixed reality vastleggen

Hoewel de primaire weergave van HoloLens 2 gebruikmaakt van additieve omgevingsmixing, wordt de renderinginhoud van de app alpha-gemengd met de videostream van de omgeving wanneer de gebruiker begint met het vastleggen van mixed reality. Als u de beste visuele kwaliteit in mixed reality video's wilt vastleggen, kunt u het beste de instellen in de van uw XR_COMPOSITION_LAYER_BLEND_TEXTURE_SOURCE_ALPHA_BITlayerFlags projectielaag.

Best practices voor prestaties op HoloLens 2

Als mobiel apparaat met ondersteuning voor hardwarereprojectie heeft HoloLens 2 strengere vereisten voor optimale prestaties. Er zijn een aantal manieren om samenstellingsgegevens via te verzenden, wat resulteert in naverwerking met een merkbare prestatiestraf.

Een swapchain-indeling selecteren

Geef altijd een semanier op voor ondersteunde pixelindelingen met behulp van en kies de eerste kleur- en diepte-pixelindeling van de runtime die door de app wordt ondersteund, omdat de runtime daar de voorkeur aan geeft voor xrEnumerateSwapchainFormats optimale prestaties. Let op: HoloLens 2 is doorgaans de DXGI_FORMAT_B8G8R8A8_UNORM_SRGB eerste keuze voor betere DXGI_FORMAT_D16_UNORM renderingprestaties. Deze voorkeur kan verschillen op VR-headsets die worden uitgevoerd op een desktop-pc, waarbij 24-bits dieptebuffers minder invloed hebben op de prestaties.

Prestatiewaarschuwing: Het gebruik van een andere indeling dan de kleurindeling van de primaire swapchain leidt tot naverwerking van runtime, wat resulteert in een aanzienlijke prestatieverbetering.

Geef altijd weer met de aanbevolen breedte/hoogte van de weergaveconfiguratie ( en van ) en gebruik altijd API om een query uit te voeren voor de aanbevolen weergavehouding, FOV en andere recommendedImageRectWidthrecommendedImageRectHeightXrViewConfigurationView renderingparameters voordat u de weergave xrLocateViews uitvoert. Gebruik altijd de XrFrameEndInfo.predictedDisplayTime van de laatste xrWaitFrame aanroep bij het uitvoeren van query's op poses en weergaven. Hierdoor kunnen HoloLens weergave aanpassen en de kwaliteit van de visual optimaliseren voor de persoon die de HoloLens.

Eén projectielaag gebruiken

HoloLens 2 heeft beperkte GPU-kracht voor het weergeven van inhoud en een hardware-compositor die is geoptimaliseerd voor één projectielaag. Als u altijd één projectielaag gebruikt, kunt u de framesnelheid, hologramstabiliteit en visuele kwaliteit van de toepassing verbeteren.

Prestatiewaarschuwing: Als u alles behalve één beveiligingslaag indient, resulteert dit in runtime na verwerking, wat resulteert in een aanzienlijke prestatiestraf.

Renderen met patroon array en VPRT

Maak er xrSwapchain een voor het linker- en rechteroog met arraySize=2 voor de kleurenwisselingsketen en een voor diepte. Geef het linkeroog weer in segment 0 en het rechter oog in segment 1. Gebruik een shader met VPRT en exemplaar van draw-aanroepen voor stereoscopic rendering om de GPU-belasting te minimaliseren. Hierdoor wordt ook de optimalisatie van de runtime mogelijk om de beste prestaties op HoloLens 2. Alternatieven voor het gebruik van een patroon array, zoals dubbel brede rendering of een afzonderlijke swapchain per oog, resulteert in runtime na verwerking, wat resulteert in een aanzienlijke prestatiestraf.

Quad-lagen vermijden

In plaats van quad-lagen als samenstellingslagen met te verzenden, geeft u de XrCompositionLayerQuad quad-inhoud rechtstreeks weer in de projectiewisselketen.

Prestatiewaarschuwing: Het bieden van extra lagen buiten één projectielaag, zoals quad-lagen, leidt tot naverwerking van runtime, wat resulteert in een aanzienlijke prestatiestraf.