Написать пост

Практические советы по использованию профайлера в Unity

Аватар Александр Ланский

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

Обложка поста Практические советы по использованию профайлера в Unity

Инструмент профилировки Unity профайлер даёт конкретные данные о производительности игры и облегчает процесс её оптимизации. Профайлер предоставляет покадровые показатели, с помощью которых можно легче выявить проблемные места. Он также даёт информацию о производительности игры вне редактора. Имейте в виду, что использование профайлера частично сказывается на производительности. Чтобы увеличить точность показателей производительности, нужно создать билд для необходимой платформы и запустить игру на целевом устройстве. Хотя наилучшую производительность можно получить на неотладочной сборке (Development Build), профайлер Unity может работать только на отладочной сборке.

Чтобы активировать профайлер в приложении, необходимо в окне Build Settings (File→Build Settings) включить параметры Development Build и Autoconnect Profiler. При запуске приложения профайлер будет запускаться автоматически. Подключить профайлер также можно в Profiler Controls через выпадающий список в редакторе.

Профайлер даёт вам информацию о том, сколько времени требуется приложению на рендер каждого кадра, разбивая это на работу процессора, рендер, память, аудио, физику, UI и сеть.

Примечание Не сравнивайте показания профайлеров разных версий Unity. Разные архитектуры профайлеров по-разному отображают показания.

Профилирование в редакторе

Не стоит забывать о некоторых подводных камнях при профилировании приложения в редакторе. Из-за большого количества открытых окон могут проскакивать лаги. Даже рендер в самом редакторе даёт о себе знать. Поэтому крайне важно хоть иногда профилировать приложение на целевом устройстве и не полагаться только на данные из редактора.

Deep Profile

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

Примечание Начиная с Unity 2017.3, режим deep profile работает не только в редакторе, но и на Android, и на Desktop, с использованием бэкенда Mono.

Для включения этого режима на Desktop используйте аргумент командной строки -deepprofiling.

Для включения этого режима на Android используйте аргумент командной строки adb.

Например:
~$ adb shell am start -n com.company.game/com.unity3d.player.UnityPlayerActivity -e 'unity' '-deepprofiling'

Профилирование памяти в редакторе

Профилирование памяти в редакторе полезно для понимания общей модели памяти, но не для фактических показателей конкретных устройств.

  • В процессе выполнения у каждого меша флаг read/write установлен независимо от значения Read/Write Enabled в настройках импорта ассета. Это уже удваивает память мешей, отображаемую в профайлере.
  • Профилирование в редакторе также отключает сжатие вершин (Vertex Compression).
  • В процессе выполнения приложения в редакторе создаётся больше временных данных в памяти. К примеру, GetComponent в случае отсутствия компонента выделяет под него временную память. Поэтому Unity может выбросить исключение в редакторе, но не сделать этого в билде.

Статистика рендера

В Unity есть функция отображения статистики рендера в реальном времени (окно Game). Туда входят fps, батчи draw calls, использование VRAM, количество вершин и треугольников. Для включения слоя статистики необходимо нажать на кнопку Stats на панели окна Game. Эта статистика поможет анализировать батчинг и GPU производительность, основываясь на количестве вызовов отрисовки.

Практические советы по использованию профайлера в Unity 1
Статистика в окне Game

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

Практические советы по использованию профайлера в Unity 2
Вкладка рендера, показывающая детальную статистику за кадр

На изображении выше видно, что пустая сцена имеет 5 вызовов SetPass и 5 вызовов отрисовки.

  • Количество вызовов SetPass играет важную роль, т. к. оно негативно влияет на производительность. Количество этих вызовов должно быть как можно меньше.
  • Вызовы отрисовки (draw calls) являются менее важным параметром, если ваше приложение не зависит от производительности процессора. Это связано с тем, что вызовы отрисовки выполняются в рендеринговом потоке, который запускается на процессоре. Уменьшить зависимость от производительности процессора можно многопоточным рендерингом.

Вызовы отрисовки

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

Многопоточный рендер и Graphics Jobs

Многопоточный рендер и Graphics Jobs (Player Settings) чаще всего положительно сказываются на производительности, но во время отладки и профилирования некоторые показатели могут быть «размытыми». Для более точного профилирования можно посмотреть на оптимизацию графики в Unity.

Кадровый отладчик

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

Отладчик не показывает отдельные вызовы отрисовки или разницу между ними. Он показывает процесс построения кадра. Только нативные GPU-профайлеры дадут исчерпывающую информацию о вызовах отрисовки (чаще всего привязанную к времени). Кадровый отладчик может оказаться полезным в отладке пайплайна и батчинга (особенно при работе с Unity UI). Детальная информация описана в документации кадрового отладчика.

Профайлер памяти

В этом проекте демонстрируется использование профайлера памяти. Также по нему есть документация.

Практические советы по использованию профайлера в Unity 3
Снимок с профайлера памяти

Данный инструмент отслеживает память, выделенную подсистемами Unity, а также пользовательскими скриптами (до версии Unity 2017.3). Профайлер не может отслеживать выделение памяти из сторонних инструментов. Начиная с версии Unity 2017.3 профайлер также поддерживает отслеживание управляемых объектов в среде выполнения Mono scripting.

Подробно профайлер можно изучить в этом видео и документации.

Следите за новыми постами
Следите за новыми постами по любимым темам
12К открытий12К показов