Производительность — MRTK2

Начало работы

Самый простой способ рационализировать производительность — с помощью частоты кадров или того, сколько раз приложение может визуализировать изображение в секунду. Важно соответствовать целевой частоте кадров, как указано в целевой платформе (т. е. Windows Mixed Reality, Oculus и т. д.). Например, в HoloLens целевая частота кадров составляет 60 кадров/с. Приложения с низкой частотой кадров могут привести к ухудшению взаимодействия с пользователем, таким как ухудшение стабилизации голограммы, отслеживание мира, отслеживание рук и многое другое. Чтобы помочь разработчикам отслеживать и достичь качественной частоты кадров, Смешанная реальность Toolkit предоставляет различные инструменты и скрипты.

Визуальный профилировщик

Для непрерывного отслеживания производительности в течение всего времени разработки настоятельно рекомендуется всегда отображать визуальный элемент с частотой кадров при выполнении & отладке приложения. Смешанная реальность Toolkit предоставляет средство диагностики Визуального профилировщика, которое в режиме реального времени предоставляет сведения о текущем использовании FPS и памяти в представлении приложения. Визуальный профилировщик можно настроить с помощью параметров системы диагностики в инспекторе профилей MRTK.

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

Примечание

При сборке для Windows Mixed Reality выполните развертывание с помощью сборок конфигурации MASTER.

Интерфейс визуального профилировщика

Окно оптимизации

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

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

Рекомендуемые параметры, указанные ниже, можно автоматически настроить в проекте Unity, используя окно оптимизации MRTK.

Параметры окна оптимизации MRTK

Профилировщик Unity

Профилировщик Unity — это полезный инструмент для изучения сведений о производительности приложения на уровне кадра за кадром.

Время, затраченное на ЦП

Пример графа профилировщика Unity

Для поддержания комфортной частоты кадров (обычно 60 кадров в секунду) приложениям необходимо достичь максимального времени кадра в 16,6 миллисекунд времени ЦП. Чтобы определить стоимость функциональных возможностей MRTK, Microsoft Смешанная реальность Toolkit содержит маркеры для путей кода внутреннего цикла (для каждого кадра). Эти маркеры используют следующий формат, чтобы помочь понять конкретные используемые функции:

[MRTK] className.methodName

Примечание

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

Пример иерархии профилировщика Unity

В этом примере иерархия была расширена, чтобы показать, что метод UpdateHandData класса WindowsMixedRealityArticulatedHand потребляет 0,44 мс времени ЦП во время анализа кадра. Эти данные можно использовать, чтобы определить, связана ли проблема с производительностью с кодом приложения или из другого места в системе.

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

Single-Pass отрисовка экземпляров

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

Тем не менее, чтобы выполнить один вызов рисования для каждой сетки к каждому глазу, все шейдеры должны поддерживать инстантирование GPU . Instancing позволяет GPU мультиплексировать вызовы между обоими глазами. Встроенные шейдеры Unity, а также стандартный шейдер MRTK по умолчанию содержат необходимые инструкции по установке в коде шейдера. При написании пользовательских шейдеров для Unity эти шейдеры, возможно, потребуется обновить для поддержки однопрохократной отрисовки экземпляров.

Пример кода для пользовательского шейдера

struct appdata
{
    float4 vertex : POSITION;
    float2 uv : TEXCOORD0;

    UNITY_VERTEX_INPUT_INSTANCE_ID //Insert
};

struct v2f
{
    float2 uv : TEXCOORD0;
    float4 vertex : SV_POSITION;

    UNITY_VERTEX_OUTPUT_STEREO //Insert
};

v2f vert (appdata v)
{
    v2f o;

    UNITY_SETUP_INSTANCE_ID(v); //Insert
    UNITY_INITIALIZE_OUTPUT(v2f, o); //Insert
    UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); //Insert

    o.vertex = UnityObjectToClipPos(v.vertex);

    o.uv = v.uv;

    return o;
}

Параметры качества

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

Шаг 1. Обновление проектов Unity смешанной реальности для использования параметра Низкий уровень качества
Редактировать>Параметры проекта, а затем выберите категорию >Качество Выберите низкое качество для платформы UWP

Шаг 2. Отключение глобального освещения в режиме реального времени для каждого файла сцены Unity
Окно>Визуализации>Параметры> освещенияСнимите флажок Глобальное освещение в реальном времени

Общий доступ к буферу глубины (HoloLens)

При разработке для платформы Windows Mixed Reality и, в частности, HoloLens, включение общего доступа к буферу глубины в параметрах XR может помочь с стабилизацией голограммы. Однако обработка буфера глубины может повлечь за собой затраты на производительность, особенно при использовании 24-разрядного формата глубины. Поэтому настоятельно рекомендуется настроить буфер глубины до 16-разрядной точности.

Если z-борьба возникает из-за нижнего битового формата, убедитесь, что для дальней плоскости клипа всех камер задано наименьшее возможное значение для приложения. Unity по умолчанию устанавливает дальней плоскости клипа 1000 м. В HoloLens дальней плоскости клипа 50 м, как правило, более чем достаточно для большинства сценариев приложений.

Примечание

При использовании 16-разрядного формата глубины необходимые эффекты буфера трафарета не будут работать, так как Unity не создает буфер трафарета в этом параметре. При обратном выборе 24-разрядного формата глубины обычно создается 8-разрядный буфер трафарета, если это применимо на графической платформе конечной точки.

Если используется компонент Mask , для которого требуется буфер трафарета, рассмотрите возможность использования RectMask2D , который не требует буфера трафарета и, таким образом, может использоваться в сочетании с 16-разрядным форматом глубины.

Примечание

Чтобы быстро определить, какие объекты сцены не записывают данные в буфер глубины визуально, можно использовать служебную программу отрисовки буфера глубины в разделе Параметры редактора в профиле конфигурации MRTK.

Оптимизация данных сетки

Параметры Optimize Mesh Data (Оптимизация данных сетки ) пытаются удалить неиспользуемые атрибуты вершин в приложении. Этот параметр выполняется путем выполнения каждого прохода шейдера в каждом материале, который находится в каждой сетке в сборке. Это хорошо для размера игровых данных и производительности среды выполнения, но может значительно замедлить время сборки.

Рекомендуется отключить этот параметр во время разработки и повторно включить во время создания сборки Master. Этот параметр можно найти в разделе Изменение>параметров> проектаПроигрыватель>Другие параметры>Оптимизация данных сетки.

Общие рекомендации

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

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

Ограниченное gpu

Так как большинство платформ для приложений смешанной реальности используют стереоскопическую отрисовку, она очень часто ограничена GPU из-за характера отрисовки экрана двойного ширины. Futhermore, мобильные платформы смешанной реальности, такие как HoloLens или Oculus Quest, будут ограничены процессорной мощностью мобильного класса & GPU.

При фокусе на GPU, как правило, есть два важных этапа, которые приложение должно завершить каждый кадр.

  1. Выполнение вершинного шейдера
  2. Выполнение пиксельного шейдера (также известного как шейдер фрагментов)

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

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

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

Это одна из основных причин использования стандартного шейдера MRTK , так как этот шейдер обычно выполняет гораздо меньше инструкций на пиксель & вершине, чем шейдер Unity Standard при достижении сопоставимых эстетических результатов.

Оптимизация ЦП Оптимизация GPU
Логика моделирования приложений Операции отрисовки
Упрощение физики Уменьшение количества вычислений освещения
Упрощение анимации Уменьшение количества многоугольников & число рисуемых объектов
Управление сборкой мусора Уменьшение числа прозрачных объектов
Ссылки на кэш Избегайте постобработки и полноэкранных эффектов

Отрисовка вызова

Одной из наиболее распространенных ошибок в Unity, которая снижает производительность, является клонирование материалов во время выполнения. Если объекты GameObject используют один и тот же материал и (или) являются одной и той же сеткой, их можно оптимизировать в одинарные вызовы draw с помощью таких методов, как статическая пакетная обработка, динамическая пакетная обработка и вставка GPU. Однако если разработчик изменяет свойства материала отрисовщика во время выполнения, Unity создаст копию клона назначенного материала.

Например, если в сцене имеется 100 кубов, разработчику может потребоваться назначить каждому из них уникальный цвет во время выполнения. Доступ к renderer.material.color в C# позволит Unity создать новый материал в памяти для конкретного отрисовщика/GameObject. Каждый из 100 кубов будет иметь свой собственный материал, поэтому они не могут быть объединены в один вызов draw, но вместо этого станут 100 запросами на вызовы от ЦП к GPU.

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

private PropertyBlock m_PropertyBlock ;
private Renderer myRenderer;

private void Start()
{
     myRenderer = GetComponent<Renderer>();
     m_PropertyBlock = new MaterialPropertyBlock();
}

private void ChangeColor()
{
    // Creates a copy of the material once for this renderer
    myRenderer.material.color = Color.red;

    // vs.

    // Retains instancing capability for renderer
    m_PropertyBlock.SetColor("_Color", Color.red);
    myRenderer.SetPropertyBlock(m_PropertyBlock);
}

Средства производительности Unity

Unity предоставляет отличные инструменты для повышения производительности, встроенные в редактор.

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

Пример статистики шейдера Unity Уровня "Стандартный"

Статистика стандартного шейдера Unity 1

Пример статистики шейдера MRTK Standard

Стандартная статистика шейдера MRTK 2

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

Unity

Windows Mixed Reality

Oculus

Оптимизация сетки