Рекомендации по приложениям ОпенксрOpenXR app best practices

Ниже приведены примеры лучших методов в файле Опенксрпрограм. cpp для басикксрапп.You can see an example of the best practices below in BasicXrApp's OpenXRProgram.cpp file. Функция Run () в начале фиксирует типичный поток кода приложения Опенкср из инициализации в цикле событий и отрисовки.The Run() function at the beginning captures a typical OpenXR app code flow from initialization to the event and rendering loop.

Рекомендации по качеству и стабильности визуального элементаBest practices for visual quality and stability

Рекомендации в этом разделе описывают, как получить лучшее визуальное качество и стабильность в любом приложении Опенкср.The best practices in this section describe how to get the best visual quality and stability in any OpenXR application.

Дополнительные рекомендации по производительности, относящиеся к HoloLens 2, см. в разделе рекомендации по производительности в hololens 2 ниже.For further performance recommendations specific to HoloLens 2, see the Best practices for performance on HoloLens 2 section below.

Гамма-Правильная отрисовкаGamma-correct rendering

Необходимо соблюдать осторожность, чтобы убедиться, что конвейер отрисовки является гамма-правильным.Care must be taken to ensure that your rendering pipeline is gamma-correct. При подготовке к просмотру в имеющуюся цепочку буферов формат представления "Визуализация-целевой объект" должен соответствовать формату имеющуюся цепочку буферов.When rendering to a swapchain, the render-target view format should match the swapchain format. Например, DXGI_FORMAT_B8G8R8A8_UNORM_SRGB для формата имеющуюся цепочку буферов и представления целевого объекта визуализации.For example, DXGI_FORMAT_B8G8R8A8_UNORM_SRGB for both the swapchain format and the render-target view. Существует исключение, если конвейер отрисовки приложения выполняет ручное преобразование sRGB в коде шейдера.There's an exception if the app's rendering pipeline does a manual sRGB conversion in shader code. Приложение должно запрашивать формат имеющуюся цепочку буферов sRGB, но использовать линейный формат для представления визуализации-целевого объекта.The app should request an sRGB swapchain format but use the linear format for the render-target view. Например, запрос в DXGI_FORMAT_B8G8R8A8_UNORM_SRGB качестве формата имеющуюся цепочку буферов, но используется в DXGI_FORMAT_B8G8R8A8_UNORM качестве представления целевого объекта для предотвращения двойной гаммы исправления содержимого.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.

Отправка буфера глубины для слоев проекцииSubmit depth buffer for projection layers

Всегда используйте XR_KHR_composition_layer_depth расширение и отправьте буфер глубины вместе с слоем проекции при отправке кадра в 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. Включение РЕПРОЕКЦИИ на глубину оборудования в HoloLens 2 повышает стабильность.Enabling hardware depth reprojection on HoloLens 2 improves hologram stability.

Выберите приемлемый диапазон глубиныChoose a reasonable depth range

Предпочтительнее использовать более узкий диапазон глубины виртуального содержимого, чтобы повысить стабильность работы HoloLens.Prefer a narrower depth range to scope the virtual content to help hologram stability on HoloLens. Например, в примере Опенксрпрограм. cpp используется 0,1 метров для 20 метров.For example, the OpenXrProgram.cpp sample is using 0.1 meters to 20 meters. Используйте Обратный-Z для более однородного разрешения глубины.Use reversed-Z for a more uniform depth resolution. В HoloLens 2 использование предпочтительного DXGI_FORMAT_D16_UNORM формата глубины поможет повысить частоту кадров и производительность, хотя буферы 16-разрядных глубин обеспечивают меньшее разрешение глубины по сравнению с 24-разрядными буферами глубины.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. Ниже приведены рекомендации по обеспечению наилучшего использования разрешения глубины.Following these best practices to make best use of the depth resolution becomes more important.

Подготовка к различным режимам смешения средыPrepare for different environment blend modes

Если ваше приложение также будет работать на впечатляющих наушниках, которые полностью блокируют мир, обязательно перечислите поддерживаемые режимы наложения среды с помощью xrEnumerateEnvironmentBlendModes API и правильно Подготовьте содержимое для подготовки к просмотру.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. Например, для системы, XR_ENVIRONMENT_BLEND_MODE_ADDITIVE такой как HoloLens, приложение должно использовать прозрачность в качестве четкого цвета, а для системы с XR_ENVIRONMENT_BLEND_MODE_OPAQUE приложение должно визуализировать непрозрачный цвет или некоторую виртуальную комнату в фоновом режиме.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.

Выбрать неограниченное пространство ссылок в качестве корневого пространства приложенияChoose unbounded reference space as application's root space

Приложения обычно устанавливают некоторое корневое пространство координат для объединения представлений, действий и голограмм.Applications typically establish some root world coordinate space to connect views, actions, and holograms together. Используйте XR_REFERENCE_SPACE_TYPE_UNBOUNDED_MSFT , если расширение поддерживается для установления геометрической системы координат, что позволяет приложению избежать нежелательного уменьшения голограммы при перемещении пользователя (например, 5 метров) с места запуска приложения.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. Используйте XR_REFERENCE_SPACE_TYPE_LOCAL в качестве резервной, если не существует расширения неограниченного пространства.Use XR_REFERENCE_SPACE_TYPE_LOCAL as a fallback if the unbounded space extension doesn't exist.

Связать голограмму с пространственной привязкойAssociate hologram with spatial anchor

При использовании неограниченного пространства ссылок голограммы, размещенные непосредственно в этом справочном пространстве, могут быть смещены по мере того, как пользователь переходит к удаленным комнатам, а затемвозвращается.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. Для пользователей с голограммами, которые помещаются в дискретное место в мире, Создайте пространственное привязку с помощью xrCreateSpatialAnchorSpaceMSFT функции расширения и поместите голограмму на ее начало.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. Это обеспечит нестабильную голограмму в зависимости от времени.That will keep that hologram independently stable over time.

Поддержка записи смешанной реальностиSupport mixed reality capture

Несмотря на то, что основной дисплей HoloLens 2 использует Аддитивное смешение среды, когда пользователь запускает смешанную запись в реальности, содержимое визуализации приложения будет иметь альфа-смешение с видеопотоком среды.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. Для достижения наилучшего визуального качества в видеороликах смешанной реальности лучше установить на XR_COMPOSITION_LAYER_BLEND_TEXTURE_SOURCE_ALPHA_BIT уровне проекции 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.

Рекомендации по повышению производительности в HoloLens 2Best practices for performance on HoloLens 2

Как мобильное устройство с поддержкой РЕПРОЕКЦИИ оборудования, HoloLens 2 имеет более четкие требования к оптимальной производительности.As a mobile device with hardware reprojection support, HoloLens 2 has stricter requirements for optimal performance. Существует несколько способов отправки данных композиции с помощью, что приводит к снижению производительности после обработки.There are a number of ways to submit composition data through, which results in post-processing with a noticeable performance penalty.

Выберите формат имеющуюся цепочку буферовSelect a swapchain format

Всегда перечислите Поддерживаемые форматы пикселей с помощью xrEnumerateSwapchainFormats , а затем выберите первый цвет и формат пикселей глубины из среды выполнения, которую поддерживает приложение, поскольку среда выполнения предпочитает оптимальную производительность.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. Обратите внимание, что в HoloLens 2 DXGI_FORMAT_B8G8R8A8_UNORM_SRGB и DXGI_FORMAT_D16_UNORM обычно является первым выбором для достижения лучшей производительности отрисовки.Note, on HoloLens 2, DXGI_FORMAT_B8G8R8A8_UNORM_SRGB and DXGI_FORMAT_D16_UNORM is typically the first choice to achieve better rendering performance. Этот параметр может отличаться на гарнитурах VR, работающих на настольном ПК, где 24-разрядные буферы глубины меньше влияют на производительность.This preference can be different on VR headsets running on a Desktop PC, where 24-bit depth buffers have less of a performance impact.

Предупреждение о производительности: Использование формата, отличного от основного цвета имеющуюся цепочку буферов, приведет к последующей обработке во время выполнения, что значительно снижает производительность.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.

Всегда отображается с рекомендуемой шириной или высотой конфигурации представления ( recommendedImageRectWidth и recommendedImageRectHeight из XrViewConfigurationView ) и всегда используйте xrLocateViews API для запроса рекомендуемых представлений фов и других параметров отрисовки перед отрисовкой.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. Всегда используйте XrFrameEndInfo.predictedDisplayTime из последнего xrWaitFrame вызова при запросе представлений и объектов.Always use the XrFrameEndInfo.predictedDisplayTime from the latest xrWaitFrame call when querying for poses and views. Это позволит HoloLens настроить визуализацию и оптимизировать визуальное качество для пользователя, людьми HoloLens.This allows HoloLens to adjust rendering and optimize visual quality for the person who is wearing the HoloLens.

Использование одного слоя проекцииUse a single projection layer

HoloLens 2 имеет ограниченные возможности GPU для отрисовки содержимого и аппаратного компоновщика, оптимизированного для одного уровня проекции.HoloLens 2 has limited GPU power for rendering content and a hardware compositor optimized for a single projection layer. Всегда использование одного уровня проекции может помочь снизить частоту работы приложения, голограмму и качество визуального элемента.Always using a single projection layer can help the application's framerate, hologram stability and visual quality.

Предупреждение о производительности: Передача любого, но одного уровня защиты приведет к последующей обработке во время выполнения, что значительно снижает производительность.Performance Warning: Submitting anything but a single protection layer will result in runtime post-processing, which comes at a significant performance penalty.

Отрисовка с помощью массива текстур и ВПРТRender with texture array and VPRT

Создайте его xrSwapchain как для левого, так и для правого глаз arraySize=2 , используя для имеющуюся цепочку буферов Color, а для глубины — один.Create one xrSwapchain for both left and right eye using arraySize=2 for color swapchain, and one for depth. Просматривайте левый глаз в срезе 0 и вправо на срез 1.Render the left eye into slice 0 and the right eye into slice 1. Используйте шейдер с ВПРТ и экземплярными вызовами Draw для отрисовки стереоскопик, чтобы избежать загрузки GPU.Use a shader with VPRT and instanced draw calls for stereoscopic rendering to minimize GPU load. Это также позволяет оптимизировать среду выполнения для достижения наилучшей производительности в HoloLens 2.This also enables the runtime's optimization to achieve the best performance on HoloLens 2. Альтернативы использованию массива текстур, такого как отрисовка на уровне Double или отдельный имеющуюся цепочку буферов на глаз, приведет к последующей обработке во время выполнения, что значительно снижает производительность.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.

Избегайте использования четырех уровнейAvoid quad layers

Вместо того чтобы отправлять четыре слоя в качестве слоев композиции с XrCompositionLayerQuad , выводите это содержимое непосредственно в имеющуюся цепочку буферов проекции.Rather than submitting quad layers as composition layers with XrCompositionLayerQuad, render the quad content directly into the projection swapchain.

Предупреждение о производительности: Предоставление дополнительных слоев за пределами одного слоя проекции, например четырех слоев, приведет к последующей обработке во время выполнения, что значительно снижает производительность.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.