Улучшите частоту кадров, уменьшите нагрузку на графический процессор и уменьшите задержку рендеринга с помощью настроек Android XR Extensions

Unity предоставляет ряд функций, связанных с производительностью, специфичных для Android XR, для которых требуется пакет расширений Android XR. Включение этих функций позволяет повысить частоту кадров и снизить нагрузку на графический процессор благодаря SpaceWarp и субсэмплированию Vulkan, а также сократить задержку отслеживаемого рендеринга с помощью поздней фиксации.

Предпосылки

Прежде чем следовать этим рекомендациям, убедитесь, что вы проверили и выполнили следующие предварительные условия:

Включить космическую деформацию

Применение URP Spacewarp — это оптимизация OpenXR, которая помогает поддерживать высокую частоту кадров за счёт синтеза каждого второго кадра. Этот метод использует векторы движения и данные о глубине из предыдущих кадров для прогнозирования перемещения пикселей, что снижает вычислительную мощность и энергопотребление.

Преимущества

  • Снижает нагрузку на графический процессор при рендеринге за счет синтеза альтернативных кадров.
  • Значительно снижает вычислительную мощность и потребление энергии.
  • Использует перепроекцию для сокращения задержки между движениями пользователя и обновлениями отображения.

Включить эту функцию

  1. В главном меню Unity выберите Правка > Настройки проекта .
  2. Разверните раздел «Управление подключаемым модулем XR» .
  3. Выберите вкладку, соответствующую вашему текущему устройству XR.
  4. Перейдите в раздел Группы функций OpenXR .
  5. В разделе Все функции включите Application SpaceWarp .

    Настройки Unity для Spacewarp

Включить субвыборку Vulkan

Технология субдискретизации Vulkan позволяет создавать и сэмплировать изображения с переменной плотностью, используя карты плотности фрагментов. Эта функция Vulkan позволяет визуализировать различные области экрана и переносить их в память с разным разрешением, что особенно полезно для фовеального рендеринга, где периферийные области могут использовать более низкое разрешение.

Преимущества

  • Обеспечивает различное улучшение в сочетании с фовеальной визуализацией в зависимости от форм-фактора.
  • Уменьшает наложение спектров в периферийных областях с помощью билинейной фильтрации.
  • Обеспечивает эффективную визуализацию с переменной скоростью в различных областях экрана.

Включить эту функцию

  1. В главном меню Unity выберите Правка > Настройки проекта .
  2. Разверните раздел Управление подключаемыми модулями XR , а затем щелкните OpenXR .
  3. Нажмите на значок шестеренки рядом с Android XR (Расширения): Управление сеансом .
  4. Включить субдискретизацию (Vulkan) .

    Настройки Unity для субдискретизации Vulkan

Включить позднюю фиксацию

Технология поздней фиксации (Late Latching) минимизирует задержку между физическим движением пользователя и соответствующим визуальным изменением на дисплее. Она позволяет обновлять положение головы на поздних этапах формирования кадров, что повышает как комфорт, так и воспринимаемую частоту кадров в приложениях XR. Это достигается за счёт сокращения задержки ввода практически на время целого кадра.

Преимущества

  • Значительно сокращает задержку преобразования движения в фотон (MTP).
  • Повышает комфорт пользователя и снижает укачивание.
  • Повышает стабильность и точность.

Включить эту функцию

Чтобы включить позднюю фиксацию, включите эту функцию во время выполнения вашего приложения:

private XRDisplaySubsystem xrDisplay;

private XRDisplaySubsystem.LateLatchNode lateLatchNode = XRDisplaySubsystem.LateLatchNode.Head;

void Start()
{
    List<XRDisplaySubsystem> xrDisplaySubsystems = new();

    SubsystemManager.GetSubsystems(xrDisplaySubsystems);

    if (xrDisplaySubsystems.Count >= 1)
    {
        xrDisplay = xrDisplaySubsystems[0];
    }
}

void Update()
{
    if (xrDisplay != null)
    {
        transform.position += new Vector3(Mathf.Epsilon, 0, 0);

        Quaternion rot = transform.rotation;

        rot.x += Mathf.Epsilon;

        transform.rotation = rot;

        xrDisplay.MarkTransformLateLatched(transform, lateLatchNode);
    }
}