Общие сведения о производительности для смешанной реальности

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

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

Платформа Целевая частота кадров
HoloLens 60 кадров/с
компьютеры Windows Mixed Reality Ultra 90 кадров/с
компьютеры Windows Mixed Reality 60 кадров/с

В приведенной ниже платформе описаны рекомендации по достижении целевой частоты кадров. Советы по измерению и улучшению частоты кадров в среде Unity см. в статье Рекомендации по производительности для Unity.

Основные сведения о узких местах производительности

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

  1. Поток приложения — ЦП — отвечает за логику приложения, включая обработку входных данных, анимацию, физику и другую логику приложения.
  2. Поток рендеринга — ЦП в GPU — отвечает за отправку вызовов draw в GPU. Когда приложению требуется отрисовка объекта, например куба или модели, этот поток отправляет запрос gpu для выполнения операций.
  3. GPU — чаще всего обрабатывает графический конвейер приложения для преобразования трехмерных данных (моделей, текстур и т. д.) в пиксели. В конечном итоге он создает двухD-изображение для отправки на экран вашего устройства.

Время существования кадра

Как правило, приложения HoloLens будут привязаны к GPU, но не всегда. Используйте приведенные ниже средства и методы, чтобы понять, где конкретное приложение является узким местом.

Анализ приложения

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

Ниже приведены некоторые распространенные средства, которые помогут вам собрать подробные сведения о профилировании для приложения.

Профилирование в любой среде

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

После снижения разрешения отрисовки, если:

  1. Частота кадров приложения увеличивается, поэтому вы, скорее всего, привязаны к GPU
  2. Частота кадров приложения не изменяется, поэтому вы, скорее всего, привязаны к ЦП

Примечание

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

UnityEngine.XR.XRSettings.renderScale = 0.7f;

Как улучшить приложение

Рекомендации по производительности ЦП

Как правило, большая часть работы в приложении смешанной реальности на ЦП включает в себя "имитацию" сцены и обработку логики приложения. Для оптимизации предназначены следующие области:

  • Анимации
  • Физика
  • Выделение памяти
  • Сложные алгоритмы (т. е. обратная кинематика, поиск путей)

Рекомендации по производительности GPU

Общие сведения о пропускной способности и скорости заполнения

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

  • Пропускная способность памяти — это скорость операций чтения и записи из памяти, которую может обеспечить GPU.
    • Чтобы определить ограничения пропускной способности, уменьшите качество текстуры и проверка, если частота кадров улучшилась.
    • Чтобы определить ограничения скорости заполнения, уменьшите разрешение экрана и посмотрите, улучшается ли частота кадров.

Примечание

Если вы работаете с Unity, проверка рекомендации по производительности GPU для Unity. — В Unity используйте свойство XRSettings.renderViewportScale .

Пропускная способность памяти обычно включает в себя оптимизацию:

  1. Более низкое разрешение текстур
  2. Использование меньшего количества текстур (нормальных, зеркальных и т. д.)

Скорость заполнения ориентирована на сокращение числа операций, которые необходимо вычислить для окончательного отображаемого пикселя, включая:

  1. Число объектов для отрисовки или обработки
  2. Количество операций на шейдер
  3. Количество этапов GPU до конечного результата (геометрические шейдеры, эффекты постобработки и т. д.)
  4. Количество пикселей для отрисовки (разрешение экрана)

Уменьшение количества многоугольников

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

Ограничение перерисовки

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

Шейдеры

Шейдеры — это небольшие программы, которые выполняются на GPU и выполняют два важных шага в отрисовке:

  1. Определение того, какие вершины следует отрисовыть и где они находятся в пространстве экрана (вершинный шейдер)
    • Шейдер вершин выполняется для каждой вершины для каждой сетки.
  2. Определение цвета каждого пикселя (шейдер пикселей)
    • Шейдер пикселей выполняется для каждого пикселя и отрисовывается геометрией в целевой текстуре отрисовки.

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

Рекомендации по программированию шейдеров
  • По возможности используйте билинейную фильтрацию
  • Переупорядочение выражений для использования встроенных функций MAD для одновременного умножения и сложения
  • Предварительно вычислите как можно больше на ЦП и передайте в качестве констант материалу
  • Предпочитать операции перемещения от шейдера пикселей к вершинным шейдерам
    • Как правило, количество вершин гораздо меньше числа пикселей (720p — 921 600 пикселей, 1080p — 2 073 600 пикселей и т. д.)

Удаление этапов GPU

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

Рекомендации по использованию памяти

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

Использование пулов объектов

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

См. также раздел