Best practices voor OpenXR-apps

U ziet een voorbeeld van de aanbevolen procedures hieronder in het bestand OpenXRProgram.cpp van BasicXrApp. De functie Run() aan het begin legt een typische OpenXR-app-codestroom vast van initialisatie naar de gebeurtenis- en renderinglus.

Best practices voor visuele kwaliteit en stabiliteit

In de aanbevolen procedures in deze sectie wordt beschreven hoe u de beste visuele kwaliteit en stabiliteit in elke OpenXR-toepassing krijgt.

Zie de sectie Best practices for performance on HoloLens 2 hieronder voor meer aanbevelingen voor prestaties die specifiek zijn voor HoloLens 2.

Gamma-correcte rendering

Zorg ervoor dat de renderingpijplijn gamma-correct is. Bij het renderen naar een swapchain moet de weergave-indeling van het renderdoel overeenkomen met de swapchain-indeling. Bijvoorbeeld DXGI_FORMAT_B8G8R8A8_UNORM_SRGB voor zowel de swapchain-indeling als de weergave render-target. Er is een uitzondering als de renderingpijplijn van de app een handmatige sRGB-conversie in shader-code uitvoert. De app moet een sRGB-swapchain-indeling aanvragen, maar de lineaire indeling gebruiken voor de weergave renderdoel. Vraag bijvoorbeeld aan DXGI_FORMAT_B8G8R8A8_UNORM_SRGB als de swapchain-indeling, maar gebruik DXGI_FORMAT_B8G8R8A8_UNORM als de weergave render-target om te voorkomen dat inhoud dubbel gamma wordt gecorrigeerd.

Dieptebuffer voor projectielagen verzenden

Gebruik XR_KHR_composition_layer_depth altijd extensie en verzend de dieptebuffer samen met de projectielaag bij het verzenden van een frame naar xrEndFrame. Het inschakelen van hardwarediepteherprojectie op HoloLens 2 verbetert de stabiliteit van hologrammen.

Kies een redelijk dieptebereik

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

Voorbereiden op verschillende omgevingsmengingsmodi

Als uw toepassing ook wordt uitgevoerd op immersive headsets die de wereld volledig blokkeren, moet u ervoor zorgen dat u ondersteunde omgevingsmengingsmodi opsommen met behulp van xrEnumerateEnvironmentBlendModes API en uw rendering-inhoud correct voorbereidt. Voor een systeem met XR_ENVIRONMENT_BLEND_MODE_ADDITIVE bijvoorbeeld de HoloLens moet de app transparant gebruiken als de duidelijke kleur, terwijl voor een systeem met XR_ENVIRONMENT_BLEND_MODE_OPAQUE, de app een ondoorzichtige kleur of een virtuele ruimte op de achtergrond moet weergeven.

Kies een niet-afhankelijke referentieruimte als de hoofdruimte van de toepassing

Toepassingen zorgen doorgaans voor een coördinaatruimte in de hoofdwereld om weergaven, acties en hologrammen met elkaar te verbinden. Gebruik XR_REFERENCE_SPACE_TYPE_UNBOUNDED_MSFT wanneer de extensie wordt ondersteund om een coördinatensysteem op wereldschaal tot stand te brengen, zodat uw app ongewenste hologramdrift kan voorkomen wanneer de gebruiker ver gaat (bijvoorbeeld op 5 meter afstand) van waar de app wordt gestart. Gebruik XR_REFERENCE_SPACE_TYPE_LOCAL als terugval als de extensie voor niet-afhankelijke ruimte niet bestaat.

Hologram koppelen aan ruimtelijk anker

Wanneer u een niet-gebonden verwijzingsruimte gebruikt, kunnen hologrammen die u rechtstreeks in die referentieruimte plaatst, afdrijven terwijl de gebruiker naar verre ruimten loopt en vervolgens terugkomt. Voor hologramgebruikers die zich op een discrete locatie in de wereld bevinden, maakt u een ruimtelijk anker met behulp van de xrCreateSpatialAnchorSpaceMSFT extensiefunctie en plaatst u het hologram op de oorsprong. Hierdoor blijft het hologram in de loop van de tijd onafhankelijk stabiel.

Ondersteuning voor het vastleggen van mixed reality

Hoewel het primaire beeldscherm van HoloLens 2 gebruikmaakt van additieve omgevingsmenging, wordt wanneer de gebruiker mixed reality-opname start, de renderinginhoud van de app alfa-gemengd met de omgevingsvideostream. Als u de beste visuele kwaliteit wilt bereiken in mixed reality-opnamevideo's, kunt u het beste de instellen in de XR_COMPOSITION_LAYER_BLEND_TEXTURE_SOURCE_ALPHA_BIT projectielaag.layerFlags

Aanbevolen procedures voor prestaties op HoloLens 2

Als mobiel apparaat met ondersteuning voor hardwareherprojectie heeft HoloLens 2 strengere vereisten voor optimale prestaties. Er zijn een aantal manieren om compositiegegevens in te dienen, wat resulteert in naverwerking met een merkbare prestatieboete.

Een wisselketenindeling selecteren

Inventariseer altijd ondersteunde pixelindelingen met behulp van xrEnumerateSwapchainFormatsen kies de eerste kleur- en dieptepixelindeling van de runtime die door de app wordt ondersteund, want dat is wat de runtime verkiest voor optimale prestaties. Let op: op HoloLens 2 DXGI_FORMAT_B8G8R8A8_UNORM_SRGB en DXGI_FORMAT_D16_UNORM is dit meestal de eerste keuze om betere renderingprestaties te bereiken. Deze voorkeur kan afwijken 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 primaire swapchain-kleurindeling resulteert in de naverwerking van runtime, wat een aanzienlijke prestatievermindering oplevert.

Altijd weergeven met de aanbevolen breedte/hoogte van weergaveconfiguratie (recommendedImageRectWidth en recommendedImageRectHeight van XrViewConfigurationView) en altijd API gebruiken xrLocateViews om te zoeken naar de aanbevolen weergavepositie, FOV en andere renderingparameters voordat ze worden weergegeven. Gebruik altijd de XrFrameEndInfo.predictedDisplayTime uit de meest recente xrWaitFrame aanroep bij het opvragen van poses en weergaven. Hierdoor kan HoloLens de rendering aanpassen en de visuele kwaliteit optimaliseren voor de persoon die de HoloLens draagt.

Eén projectielaag gebruiken

HoloLens 2 heeft beperkte GPU-kracht voor het weergeven van inhoud en een hardware-configuratie die is geoptimaliseerd voor één projectielaag. Het gebruik van één projectielaag kan de framerate, de stabiliteit van hologrammen en de visuele kwaliteit van de toepassing helpen.

Prestatiewaarschuwing: Als u alles behalve één beveiligingslaag indient, resulteert dit in de naverwerking van runtime, wat een aanzienlijke prestatieboete met zich mee brengt.

Weergeven met patroonmatrix en VPRT

Maak er een xrSwapchain voor zowel het linker- als rechteroog met behulp van arraySize=2 voor kleurwisselketen en één voor diepte. Geef het linkeroog weer in segment 0 en het rechteroog in segment 1. Gebruik een shader met VPRT en instanced draw-aanroepen voor stereoscopische rendering om de GPU-belasting te minimaliseren. Hierdoor kan de runtime ook worden geoptimaliseerd om de beste prestaties te bereiken op HoloLens 2. Alternatieven voor het gebruik van een patroonmatrix, zoals dubbelbrede rendering of een afzonderlijke wisselhanger per oog, leiden tot runtime-naverwerking, wat een aanzienlijke prestatievermindering oplevert.

Vier lagen vermijden

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

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