Настройка показателей производительности в Unity Profiler

Оптимизация Вашего приложения требует возможности точно измерить, как Ваш проект потребляет аппаратные ресурсы. Расширение Unity Profiler собственными показателями производительности позволяет Вам лучше понять уникальную историю производительности Вашего приложения. В этом посте мы расскажем о новых возможностях расширения Profiler в Unity 2021 LTS.
Наши новые счетчики Profiler представляют собой легкий механизм для добавления собственных показателей производительности в приложения и пакеты Unity. Теперь Вы также можете визуализировать свои показатели прямо в окне Profiler, добавив собственные модули Profiler Modules. Читайте далее, чтобы узнать, как использовать эти возможности для повышения производительности Вашего проекта Unity.
Unity Profiler - это инструмент, который Вы можете использовать для получения подробной информации о производительности Вашего приложения. Он отслеживает большое количество показателей производительности по целому ряду категорий, таких как память, звук и рендеринг. Эти показатели визуализируются в окне Profiler, а в некоторых случаях их также можно запросить из сценария. Используя эту информацию, Вы можете получить представление о том, как Ваше приложение Unity использует доступные аппаратные ресурсы целевой платформы, что поможет Вам определить, где можно провести оптимизацию.

Счетчики профилировщика отслеживают, измеряют или подсчитывают метрики в Вашем приложении Unity, которые полезны для анализа производительности. Например, Unity определяет встроенный счетчик Profiler для отслеживания общего количества байт памяти, используемой Вашим приложением, под названием "Total Used Memory". Это полезная статистика, позволяющая оценить объем памяти, занимаемый Вашим приложением на целевом устройстве. Вы можете увидеть это значение, отображаемое с течением времени, наряду с другими показателями, связанными с памятью, в модуле Memory окна Profiler, как показано ниже.

Добавив собственные счетчики Profiler, Вы можете получить показатели производительности, уникальные для Ваших собственных систем и приложений. Эти показатели могут отображаться в окне Profiler наряду с другими данными о производительности, включая встроенные счетчики. Это позволяет Вам просматривать характеристики производительности, уникальные для Вашего приложения, в контексте, прямо в окне Profiler.
В приведенном ниже примере пользовательский счетчик Profiler был добавлен для отслеживания количества активных существ в сцене. Он отображается рядом со встроенным счетчиком Profiler, Batches Count, который отслеживает количество обработанных партий рендеринга в каждом кадре. Это позволяет нам легко соотнести эти две метрики и увидеть влияние количества существ на количество партий, которые должен обработать рендерер.

Кроме того, все Ваши счетчики Profiler доступны в Release Builds, а также некоторые встроенные, если они указаны. Релизные сборки более репрезентативны для реальной производительности Вашего приложения, чем девелоперские сборки.
Однако, по соображениям оптимизации, Unity Profiler не может быть подключен к Release Builds. Поэтому Вы можете выборочно отслеживать важные метрики в Release Builds, используя счетчики Profiler и запрашивая их из скрипта. Например, Вы можете сделать это в ходе непрерывного интеграционного тестирования, чтобы обнаружить регрессии производительности. Или же Вы можете отобразить некоторые ключевые показатели производительности через внутриигровой отладочный пользовательский интерфейс, используя одну из систем пользовательского интерфейса Unity, как, например, в левом нижнем углу приведенного ниже примера. Более подробную информацию Вы найдете в документации Profiler Recorder.

Если Вы хотите, чтобы счетчики Profiler присутствовали только в сборках разработки, Вы можете исключить их из сборки релиза, обернув их в символ сценария DEVELOPMENT_BUILD, как описано в документации по условной компиляции.
Наши счетчики Profiler доступны в пакете Profiling.Core, выпущенном в Unity 2021 LTS. Пакет поставляется в комплекте с Unity 2021 LTS, но не установлен по умолчанию, поэтому следуйте инструкциям по установке в документации к пакету, чтобы добавить этот пакет из Менеджера пакетов по имени.
Получив пакет, Вы можете создать счетчик Profiler, называемый в API ProfilerCounter или ProfilerCounterValue, и обновить его следующим образом.
using UnityEngine;
using Unity.Profiling;
public class CreatureCounter : MonoBehaviour
{
static readonly ProfilerCounterValue<int> k_CreatureCounter = new(ProfilerCategory.Scripts, "Creature Count",
ProfilerMarkerDataUnit.Count, ProfilerCounterOptions.FlushOnEndOfFrame);
void OnEnable()
{
k_CreatureCounter.Value += 1;
}
void OnDisable()
{
k_CreatureCounter.Value -= 1;
}
}
cs
Более подробную информацию Вы найдете в документации к пакету Profiling.Core.
Модуль Profiler представляет информацию о производительности для определенной области или рабочего процесса в окне Profiler, например, памяти, звука или рендеринга. Каждый модуль Profiler призван дать представление о профиле производительности своей области. Например, модуль Memory Profiler, показанный ниже, отображает семь ключевых показателей, относящихся к использованию памяти в течение времени. Ниже находится подробная секция модуля, показывающая распределение памяти в выбранной рамке.

В Unity 2021 LTS окно Profiler может быть настроено с помощью Ваших собственных модулей Profiler. Это позволит Вам представить показатели производительности Ваших собственных систем прямо в окне Profiler. Кроме того, он предоставляет возможность настраиваемой визуализации в детальном представлении Вашего модуля, позволяя Вам представить данные о производительности Вашей системы так, как Вы пожелаете.
Редактор модулей Profiler
Редактор модулей Profiler рекомендуется для быстрого создания временных модулей Profiler для собственного использования. Например, Вы можете использовать его для быстрого создания модуля Profiler для проверки нового счетчика Profiler. Модули Profiler, созданные с помощью Profiler Module Editor, локальны для Вашего редактора и недоступны для других пользователей проекта.

Более подробную информацию Вы найдете в документации по Редактору модулей.
API модуля профилировщика
API модуля Profiler позволяет Вам добавить свой собственный модуль Profiler в окно Profiler для всех пользователей проекта или пакета. Когда модуль Profiler определяется в проекте или пакете с помощью этого API, он автоматически становится доступным в окне Profiler для всех пользователей этого проекта или пакета.
Если Вы являетесь издателем Asset Store или разработчиком пакета, теперь Вы можете распространять пользовательские модули Profiler вместе с Вашим пакетом. Когда пользователь устанавливает Ваш пакет, Ваши модули Profiler автоматически становятся доступными в окне Profiler для Ваших пользователей. Это позволит Вам отображать показатели производительности Вашего пакета прямо в окне Profiler.
Несколько команд в Unity уже используют этот API для распространения пользовательских модулей Profiler вместе со своими пакетами, включая пакеты Netcode for GameObjects, Adaptive Performance и Mali System Metrics.
Как использовать
Чтобы добавить модуль Profiler с помощью API модуля Profiler, создайте скрипт ProfilerModule в своем проекте или пакете, как показано ниже.
using Unity.Profiling;
using Unity.Profiling.Editor;
[System.Serializable]
[ProfilerModuleMetadata("Creature Batches")]
public class CreatureBatchesProfilerModule : ProfilerModule
{
static readonly ProfilerCounterDescriptor[]
k_Counters = {
new("Creature Count", ProfilerCategory.Scripts),
new("Batches Count", ProfilerCategory.Render), };
public CreatureBatchesProfilerModule() : base(k_Counters) { }
}
cs
Модуль будет автоматически отображаться в окне Profiler для всех пользователей проекта или пакета.

Более подробную информацию об использовании API модуля Profiler см. в Руководстве и документации по API.
API модуля Profiler включает в себя возможность нарисовать пользовательскую визуализацию данных о производительности для выбранного кадра с помощью одной из систем пользовательского интерфейса Unity Editor, например, UI Toolkit.
Например, модуль Profiler пакета Adaptive Performance использует этот API для представления подробной информации о производительности в выбранном кадре, а также контекстной информации, такой как индикаторы Bottleneck и Thermal Warning. Эти индикаторы помогут пользователю пакета Adaptive Performance четко определить, когда, например, он может столкнуться с тепловым дросселированием. Вы можете использовать этот API для создания индивидуальной визуализации данных о производительности Вашего модуля Profiler.

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

Чтобы отправить в Profiler дополнительные данные кадра, например, изображение, и впоследствии получить их из захвата Profiler, Вы можете использовать API метаданных кадра, Profiler.EmitFrameMetaData и FrameDataView.GetFrameMetaData.
Если у Вас есть дополнительные данные, которые нужно отправить только один раз за сеанс профилирования, например, данные конфигурации, Вы можете использовать API метаданных сеанса, Profiler.EmitSessionMetaData и FrameDataView.GetSessionMetaData.
Примеры того, как и когда использовать эти функции, смотрите в документации по ссылке выше.
В этом посте мы рассказали о том, как расширить Unity Profiler собственными показателями производительности. Мы рассмотрели добавление пользовательских показателей с помощью наших новых счетчиков Profiler, доступных в Profiling.Core пакете. Затем мы изучили добавление пользовательских модулей Profiler в окно Profiler с помощью редактора модулей Profiler и API модулей Profiler. Наконец, мы рассмотрели отправку дополнительных сложных данных в Profiler, например, изображения, чтобы предоставить больше контекстной информации.
Мы надеемся, что эти функции расширения Profiler, добавленные в Unity 2021 LTS, позволят Вам лучше измерить и понять уникальную историю производительности Вашего приложения. Пожалуйста, не стесняйтесь обращаться к команде на нашей странице в форуме. Мы будем рады услышать Ваши отзывы и узнать, как мы можем улучшить инструментарий производительности Unity для Вас.