Práticas recomendadas do aplicativo OpenXROpenXR app best practices

Você pode ver um exemplo das práticas recomendadas abaixo no arquivo OpenXRProgram. cpp do BasicXrApp.You can see an example of the best practices below in BasicXrApp's OpenXRProgram.cpp file. A função Run () no início captura um fluxo de código do aplicativo OpenXR típico da inicialização para o loop de evento e de renderização.The Run() function at the beginning captures a typical OpenXR app code flow from initialization to the event and rendering loop.

Práticas recomendadas para qualidade visual e estabilidadeBest practices for visual quality and stability

As práticas recomendadas nesta seção descrevem como obter a melhor qualidade visual e estabilidade em qualquer aplicativo OpenXR.The best practices in this section describe how to get the best visual quality and stability in any OpenXR application.

Para obter mais recomendações de desempenho específicas para o HoloLens 2, consulte a seção práticas recomendadas de desempenho no hololens 2 abaixo.For further performance recommendations specific to HoloLens 2, see the Best practices for performance on HoloLens 2 section below.

Gama-renderização corretaGamma-correct rendering

Deve-se ter cuidado para garantir que seu pipeline de renderização seja de gama correto.Care must be taken to ensure that your rendering pipeline is gamma-correct. Ao renderizar para um SwapChain, o formato de exibição de destino de renderização deve corresponder ao formato SwapChain.When rendering to a swapchain, the render-target view format should match the swapchain format. Por exemplo, DXGI_FORMAT_B8G8R8A8_UNORM_SRGB para o formato SwapChain e a exibição de destino render.For example, DXGI_FORMAT_B8G8R8A8_UNORM_SRGB for both the swapchain format and the render-target view. Há uma exceção se o pipeline de renderização do aplicativo faz uma conversão manual do sRGB no código do sombreador.There's an exception if the app's rendering pipeline does a manual sRGB conversion in shader code. O aplicativo deve solicitar um formato de SwapChain sRGB, mas usar o formato linear para a exibição de destino de renderização.The app should request an sRGB swapchain format but use the linear format for the render-target view. Por exemplo, solicite DXGI_FORMAT_B8G8R8A8_UNORM_SRGB como o formato SwapChain, mas use DXGI_FORMAT_B8G8R8A8_UNORM como a exibição de destino de renderização para impedir que o conteúdo seja corrigido de gama duplo.For example, 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.

Enviar buffer de profundidade para camadas de projeçãoSubmit depth buffer for projection layers

Sempre use XR_KHR_composition_layer_depth a extensão e envie o buffer de profundidade junto com a camada de projeção ao enviar um quadro para xrEndFrame .Always use XR_KHR_composition_layer_depth extension and submit the depth buffer together with the projection layer when submitting a frame to xrEndFrame. Habilitar a Reprojeção de profundidade de hardware no HoloLens 2 melhora a estabilidade do holograma.Enabling hardware depth reprojection on HoloLens 2 improves hologram stability.

Escolher um intervalo de profundidade razoávelChoose a reasonable depth range

Prefira um intervalo de profundidade mais estreito para o escopo do conteúdo virtual para ajudar a estabilidade do holograma no HoloLens.Prefer a narrower depth range to scope the virtual content to help hologram stability on HoloLens. Por exemplo, o exemplo OpenXrProgram. cpp está usando 0,1 metros para 20 metros.For example, the OpenXrProgram.cpp sample is using 0.1 meters to 20 meters. Use -Z invertido para uma resolução de profundidade mais uniforme.Use reversed-Z for a more uniform depth resolution. No HoloLens 2, o uso do DXGI_FORMAT_D16_UNORM formato de profundidade preferencial ajudará a obter melhor desempenho e taxa de quadros, embora os buffers de profundidade de 16 bits forneçam uma resolução de menos profundidade que os buffers de profundidade de 24 bits.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. Seguir essas práticas recomendadas para fazer o melhor uso da resolução de profundidade se torna mais importante.Following these best practices to make best use of the depth resolution becomes more important.

Preparar para modos de mesclagem de ambiente diferentesPrepare for different environment blend modes

Se seu aplicativo também for executado em headsets de imersão que bloqueiam completamente o mundo, certifique-se de enumerar modos de mesclagem de ambiente com suporte usando a xrEnumerateEnvironmentBlendModes API e prepare o conteúdo de renderização corretamente.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 correctly. Por exemplo, para um sistema com como XR_ENVIRONMENT_BLEND_MODE_ADDITIVE o HoloLens, o aplicativo deve usar transparente como a cor clara, enquanto para um sistema com XR_ENVIRONMENT_BLEND_MODE_OPAQUE , o aplicativo deve renderizar alguma cor opaca ou alguma sala virtual em segundo plano.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.

Escolher o espaço de referência não associado como espaço raiz do aplicativoChoose unbounded reference space as application's root space

Normalmente, os aplicativos estabelecem algum espaço de coordenadas do mundo raiz para conectar modos de exibição, ações e hologramas juntos.Applications typically establish some root world coordinate space to connect views, actions, and holograms together. Use XR_REFERENCE_SPACE_TYPE_UNBOUNDED_MSFT quando a extensão tiver suporte para estabelecer um sistema de coordenadas de escala mundial, permitindo que seu aplicativo Evite descompassos de holograma indesejados quando o usuário se mover para longe (por exemplo, 5 metros de distância) de onde o aplicativo é iniciado.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 (for example, 5 meters away) from where the app starts. Use XR_REFERENCE_SPACE_TYPE_LOCAL como um fallback se a extensão de espaço não associado não existir.Use XR_REFERENCE_SPACE_TYPE_LOCAL as a fallback if the unbounded space extension doesn't exist.

Associar holograma a âncora espacialAssociate hologram with spatial anchor

Ao usar um espaço de referência não associado, os hologramas que você coloca diretamente no espaço de referência podem cair conforme o usuário percorre as salas distantes e, em seguida, retorna.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. Para usuários com holograma, coloque em um local discreto no mundo, crie uma âncora espacial usando a xrCreateSpatialAnchorSpaceMSFT função de extensão e posicione o holograma em sua origem.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. Isso manterá esse holograma independentemente estável ao longo do tempo.That will keep that hologram independently stable over time.

Suporte à captura de realidade misturadaSupport mixed reality capture

Embora a exibição principal do HoloLens 2 Use a mistura de ambiente aditivo, quando o usuário inicia a captura de realidade misturada, o conteúdo de renderização do aplicativo será misturado com o fluxo de vídeo do ambiente.Although HoloLens 2's primary display uses additive environment blending, when the user starts mixed reality capture, the app's rendering content will be alpha-blended with the environment video stream. Para obter a melhor qualidade visual em vídeos de captura de realidade misturada, é melhor definir o XR_COMPOSITION_LAYER_BLEND_TEXTURE_SOURCE_ALPHA_BIT na camada de projeção layerFlags .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.

Práticas recomendadas para o desempenho no HoloLens 2Best practices for performance on HoloLens 2

Como um dispositivo móvel com suporte à Reprojeção de hardware, o HoloLens 2 tem requisitos mais estritos para o desempenho ideal.As a mobile device with hardware reprojection support, HoloLens 2 has stricter requirements for optimal performance. Há várias maneiras de enviar dados de composição por meio de, o que resulta em pós-processamento com uma penalidade de desempenho perceptível.There are a number of ways to submit composition data through, which results in post-processing with a noticeable performance penalty.

Selecionar um formato SwapChainSelect a swapchain format

Sempre enumere os formatos de pixel com suporte usando e xrEnumerateSwapchainFormats escolha o primeiro formato de cor e profundidade de pixel do tempo de execução ao qual o aplicativo dá suporte, pois é isso que o tempo de execução prefere para o desempenho ideal.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. Observe, no HoloLens 2, DXGI_FORMAT_B8G8R8A8_UNORM_SRGB e DXGI_FORMAT_D16_UNORM normalmente é a primeira opção para obter um melhor desempenho de renderização.Note, on HoloLens 2, DXGI_FORMAT_B8G8R8A8_UNORM_SRGB and DXGI_FORMAT_D16_UNORM is typically the first choice to achieve better rendering performance. Essa preferência pode ser diferente nos headsets de VR em execução em um PC desktop, em que os buffers de profundidade de 24 bits têm menos impacto no desempenho.This preference can be different on VR headsets running on a Desktop PC, where 24-bit depth buffers have less of a performance impact.

Aviso de desempenho: Usar um formato diferente do formato de cor SwapChain primário resultará em pós-processamento do tempo de execução, o que acarreta uma penalidade de desempenho significativa.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.

Sempre renderizar com a largura/altura da configuração de exibição recomendada ( recommendedImageRectWidth e recommendedImageRectHeight de XrViewConfigurationView ) e sempre usar a xrLocateViews API para consultar a exibição recomendada, FOV e outros parâmetros de renderização antes da renderização.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. Sempre use a XrFrameEndInfo.predictedDisplayTime da chamada mais recente xrWaitFrame ao consultar poses e exibições.Always use the XrFrameEndInfo.predictedDisplayTime from the latest xrWaitFrame call when querying for poses and views. Isso permite que o HoloLens ajuste a renderização e otimize a qualidade visual para a pessoa que está desgastando o HoloLens.This allows HoloLens to adjust rendering and optimize visual quality for the person who is wearing the HoloLens.

Usar uma única camada de projeçãoUse a single projection layer

O HoloLens 2 tem energia limitada de GPU para renderizar conteúdo e um compositor de hardware otimizado para uma única camada de projeção.HoloLens 2 has limited GPU power for rendering content and a hardware compositor optimized for a single projection layer. Sempre usar uma única camada de projeção pode ajudar a taxa de quadros, a estabilidade do holograma e a qualidade visual do aplicativo.Always using a single projection layer can help the application's framerate, hologram stability and visual quality.

Aviso de desempenho: O envio de qualquer coisa, exceto uma única camada de proteção, resultará em pós-processamento do tempo de execução, o que acarreta uma penalidade de desempenho significativa.Performance Warning: Submitting anything but a single protection layer will result in runtime post-processing, which comes at a significant performance penalty.

Renderizar com matriz de textura e VPRTRender with texture array and VPRT

Crie um xrSwapchain para os olhos esquerdo e direito usando arraySize=2 para SwapChain de cor e outro para profundidade.Create one xrSwapchain for both left and right eye using arraySize=2 for color swapchain, and one for depth. Renderize o olho esquerdo na fatia 0 e no olho certo para a fatia 1.Render the left eye into slice 0 and the right eye into slice 1. Use um sombreador com VPRT e chamadas de desenho em instância para a renderização estereoscópico para minimizar a carga de GPU.Use a shader with VPRT and instanced draw calls for stereoscopic rendering to minimize GPU load. Isso também permite que a otimização do tempo de execução alcance o melhor desempenho no HoloLens 2.This also enables the runtime's optimization to achieve the best performance on HoloLens 2. Alternativas ao uso de uma matriz de textura, como renderização em toda a parte ou uma SwapChain separada por olho, resultarão no pós-processamento do tempo de execução, o que acarreta uma penalidade de desempenho significativa.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.

Evitar camadas quádruplasAvoid quad layers

Em vez de enviar camadas quádruplas como camadas de composição com XrCompositionLayerQuad , processe o conteúdo Quad diretamente na projeção SwapChain.Rather than submitting quad layers as composition layers with XrCompositionLayerQuad, render the quad content directly into the projection swapchain.

Aviso de desempenho: Fornecer camadas adicionais além de uma única camada de projeção, como camadas quádruplas, resultará em pós-processamento do tempo de execução, o que acarreta uma penalidade de desempenho significativa.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.