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

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

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

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

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

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

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

Вот к чему мы стремимся: 

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

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

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

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

Фовеальный рендеринг

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

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

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

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

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

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

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

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

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

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

Резидентный отрисовщик графического процессора

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

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

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

Отсечение невидимой геометрии на графическом процессоре

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

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

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

Отслеживание эффективности

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

Performance Metrics API

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

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

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

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

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

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

Хотите убедиться, что SRP Batcher работает? Найдите записи RenderLoopNewBatcher в Frame Debugger. Проверяете, правильно ли GPU Resident Drawer выполняет пакетную обработку? Найдите записи Hybrid Batch Group. Эти визуальные подтверждения помогают понять, действительно ли ваши настройки оптимизации вступают в силу.

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

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

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

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

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

Заключение

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

Вот ваш план:

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

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

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

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

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