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

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

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

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

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

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

Примечание

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

Интерфейс профилировщика визуальных элементов

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

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

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

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

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

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

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

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

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

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

[MRTK] className.methodName

Примечание

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

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

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

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

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

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

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

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

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

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

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

Привязка GPU

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

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

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

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

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

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

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

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

Рисование экземпляров вызовов

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

Например, если в сцене есть 100 кубов, разработчику может потребоваться назначить уникальный цвет каждому во время выполнения. Доступ renderer.material.color в C# создаст новый материал в памяти для данного конкретного отрисовщика или 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 уровня

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

Статистика стандартных шейдеров MRTK 2

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

Unity

Windows Mixed Reality

Oculus

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