Новости продуктов

Как оптимизировать производительность Android XR с помощью Unity

Время на чтение: 6 минут
Посмотреть профиль Люка Хопкинса
Luke Hopkins Инженер по связям с разработчиками Android

Samsung Galaxy XR уже в продаже с Android XR! Эта запись в блоге – часть недели Android XR, в рамках которой мы публикуем ресурсы (записи в блоге, видео, образцы кода и т. д.), чтобы помочь вам изучить Android XR, создавать приложения для этой платформы и готовить их к выпуску.  

На этой неделе Samsung выпустила Galaxy XR – устройство, разработанное в сотрудничестве с Google и Qualcomm. Мы хотим помочь вам добиться максимальной производительности ваших приложений для XR-устройств.

Если игра или приложение для обычного устройства работает медленно, это может вызвать у пользователя раздражение. В случае с XR-устройствами низкая производительность не просто нежелательна, а недопустима. Если частота кадров в приложении для XR-устройства будет ниже целевой, это может привести к серьезным проблемам, например к укачиванию.

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

Вот что мы хотим сделать: 

  • Минимальное значение: 72 кадра в секунду (согласно нашим рекомендациям по обеспечению качества воспроизведения).
  • Необязательно: 90 кадров в секунду с бюджетом 11 мс на кадр

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

Функции для повышения производительности XR

Мы начнем с двух функций, которые относятся к производительности в XR: рендеринга с отслеживанием взгляда и субдискретизации Vulkan. 

Фовеальная отрисовка

Рендеринг с переменным разрешением – это оптимизация, которая имеет два режима. Первый – статический режим, в котором центр экрана отрисовывается с более высоким разрешением, а разрешение снижается по мере удаления от центра.

Второй режим – отслеживание взгляда. В нем с максимальной детализацией показывается только то, на что вы смотрите, а качество изображения на периферии снижается. Она имитирует человеческое зрение, при котором мы видим детали только в той области, на которой сфокусировано наше внимание.

Фовеальная отрисовка значительно снижает нагрузку на графический процессор без ущерба для воспринимаемого пользователем качества изображения. Преимущество рендеринга с отслеживанием взгляда в том, что пользователи не заметят снижения качества на периферии зрения, а вот графический процессор точно заметит повышение производительности.

Представьте, что вы создаете музей с детализированными 3D-экспонатами. Без рендеринга с отслеживанием взгляда вам будет сложно поддерживать частоту 90 кадров в секунду, пытаясь отрисовать все в поле зрения. С рендерингом с отслеживанием взгляда вы можете сохранить высокую детализацию объектов, на которые смотрит пользователь, но при этом фон будет отрисовываться с более низким качеством. Пользователи не заметят разницы, но у вас будет больше возможностей для добавления деталей в сцену.

Субдискретизация Vulkan

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

В сочетании с рендерингом с отслеживанием взгляда Vulkan Subsampling позволяет повысить производительность на 0, 5 мс. Кроме того, она сглаживает неровные края в периферийном зрении, делая изображение более четким.

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

Функции графического процессора для сложных сцен

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

Выдвигающаяся панель с данными о графическом процессоре

Постоянный объект на GPU автоматически использует инстансирование GPU, чтобы уменьшить количество вызовов отрисовки и освободить время обработки ЦП. Вместо того чтобы сообщать графическому процессору о каждом объекте по отдельности, центральный процессор объединяет похожие объекты в группы.

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

Представь лесную сцену с 200 деревьями, созданными на основе одной и той же базовой сетки. Без панели GPU Resident Drawer 200 вызовов отрисовки нагружают графический процессор, освобождая центральный. Если вы включите эту функцию, графический процессор будет создавать экземпляры деревьев, что позволит сократить количество вызовов отрисовки до 5–10. Это позволяет значительно сэкономить ресурсы графического процессора и использовать их для логики игры или физических расчетов.

Отсечение невидимых объектов на графическом процессоре

Отсечение невидимых объектов на GPU использует графический процессор вместо центрального процессора, чтобы определять и пропускать отрисовку скрытых объектов. Он автоматически определяет, что скрыто за другими объектами, поэтому ресурсы графического процессора не тратятся на то, что пользователь не видит.

Эта функция особенно полезна в помещениях с несколькими комнатами, в плотной застройке или в архитектурных сценах, где стены, полы и объекты естественным образом блокируют обзор.

Предположим, вы создаете приложение для управления несколькими комнатами. Если пользователь находится в гостиной, зачем тратить ресурсы графического процессора на отрисовку кухни, которая полностью скрыта за стеной? GPU Occlusion Culling автоматически пропускает отрисовку скрытых объектов, предоставляя больший бюджет производительности для того, что действительно видно.

Мониторинг эффективности

Недостаточно просто использовать эти функции. Вам также нужно отслеживать результаты оптимизации, чтобы оценивать ее влияние и убеждаться, что изменения действительно работают.

Performance Metrics API

Performance Metrics API позволяет в реальном времени отслеживать использование памяти, производительность ЦП и производительность графического процессора в ваших приложениях. Он предоставляет подробные данные с уровня композитора и среды выполнения, чтобы вы могли точно понять, что происходит в приложении.

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

До включения отрисовки с отслеживанием взгляда время формирования кадра графическим процессором может составлять 13 мс, что превышает допустимое значение в 11 мс. Включите рендеринг с фокусировкой, снова проведите измерения, и вы увидите, что время обработки снизилось до 9 мс. Таким образом, вы получаете запас в 4 мс, который можно использовать, чтобы добавить больше деталей в сцену, улучшить качество изображения в других местах или просто обеспечить более плавную работу с более широким диапазоном контента.

Без этих показателей оптимизация будет выполняться вслепую. Performance Metrics API позволяет узнать, что именно помогает в вашем случае.

Отладчик кадров

Отладчик кадров – это встроенный инструмент Unity, который позволяет понять, как именно отрисовывается сцена, кадр за кадром. Он показывает последовательность вызовов отрисовки и позволяет пошагово проверять, правильно ли работают оптимизации.

Как проверить, работает ли пакетная обработка SRP Найдите в отладчике кадров записи RenderLoopNewBatcher. Проверяете ли вы, правильно ли работает пакетная обработка в GPU Resident Drawer? Найдите записи "Гибридная пакетная группа". Эти визуальные подтверждения помогают понять, действительно ли применяются настройки оптимизации.

Перейдите к первым 50 вызовам отрисовки в сцене. Если вы видите, что похожие объекты отрисовываются по отдельности, а не пакетами, значит, инстансирование или пакетная обработка работают неправильно. Отладчик кадров позволяет сразу увидеть эти проблемы и устранить их.

Дополнительные варианты оптимизации

В полном руководстве по повышению эффективности также описаны другие способы оптимизации. Вот краткое описание:

  • Настройки URP: отключите HDR и постобработку для мобильных устройств XR. Эти функции оказывают минимальное визуальное воздействие по сравнению с их влиянием на производительность мобильного устройства, поэтому вы получите заметный прирост производительности при едва заметных визуальных различиях.
  • Пакетная обработка SRP. Снижает нагрузку на процессор при работе со сценами, в которых много материалов с одним и тем же вариантом шейдера. Минимизируя изменения состояния отрисовки между вызовами отрисовки, вы можете значительно сократить время ЦП, затрачиваемое на отрисовку.
  • Частота обновления экрана. Динамически регулируется в диапазоне от 72 до 90 кадров в секунду в зависимости от сложности сцены. Уменьшайте частоту кадров в сложных сценах, чтобы обеспечить стабильность, а затем увеличивайте ее в более простых моментах для плавного взаимодействия.
  • Текстуры глубины/непрозрачности. Отключите их, если они не нужны для эффектов шейдера. Они вызывают ненужные операции копирования на графическом процессоре, которые снижают производительность без какой-либо пользы для большинства приложений.
  • Масштаб отрисовки URP. Эта настройка позволяет отрисовывать изображение с пониженным разрешением, чтобы повысить производительность, или с повышенным разрешением, чтобы улучшить качество графики.

Пошаговые инструкции по этим и другим способам оптимизации приведены в полном руководстве по повышению производительности Unity для Android XR.

Заключение

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

Вот план действий:

  1. Начните с адаптивного рендеринга и субдискретизации Vulkan. Эти функции для устройств XR позволяют сразу же заметить, что графический процессор стал работать эффективнее.
  2. Если у вас сложные сцены с повторяющейся геометрией или внутренними пространствами, добавьте GPU Resident Drawer и Occlusion Culling.
  3. Отслеживайте все с помощью Metrics API, чтобы убедиться, что изменения действительно помогают
  4. Дополнительные возможности оптимизации URP для повышения производительности

Важно постоянно отслеживать результаты и вносить изменения. Не каждая оптимизация одинаково полезна для всех проектов, поэтому используйте Performance Metrics API, чтобы понять, что именно поможет в вашем случае.

Что дальше: расширяйте свои навыки

Хотите узнать больше? Ознакомьтесь со следующими материалами:

  • Руководство по оптимизации производительности Unity для Android XR – пошаговые инструкции по реализации всех функций, описанных здесь.
  • Начало работы с Unity и Android XR – настройте среду разработки и начните создавать приложения.
  • Документация для разработчиков Android XR – подробные руководства по всем функциям Android XR.
Автор:
Продолжить чтение