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

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

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

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

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

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

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

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

Lifetime of a Frame

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

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

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

Шейдеры

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

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

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

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

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

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

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

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

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

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

См. также