Найти в Дзене
Another Art

Окно профилировщика в Unity

Приветствую всех друзья!Сегодня речь пойдет об окне профилировщика (Profiler window).
Оглавление

Приветствую всех друзья! В прошлой статье я рассказал о типичных проблемах, которые могут возникнуть при работе с редактором Unity. Сегодня речь пойдет об окне профилировщика (Profiler window).

Картинка для привлечения внимания из открытых источников
Картинка для привлечения внимания из открытых источников

Чтобы получить доступ к окну профилировщика пройдите по следующему пути в контекстном верхнем меню Window/Analysis/Profiler или используйте сочетание горячих клавиш Ctrl+7 на Windows или Command+7 на macOS.

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

По умолчанию профилировщик записывает и сохраняет последние 300 кадров вашей игры, а также показывает вам подробную информацию о каждом кадре. Вы можете увеличить количество кадров, которые он записывает в окне настроек (меню: File/Preferences), до 2000 кадров. Если вы увеличите этот параметр до большого количества кадров, накладные расходы профилировщика и использование памяти станут более интенсивными.

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

Окно профилировщика.

Окно профилировщика выглядит следующим образом:

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

A. Профайлер модулей. Это список всех модулей, которые вы можете профилировать в своем приложении. Используйте раскрывающееся меню в верхней части этой области, чтобы добавлять и удалять модули из окна.

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

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

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

Элементы управления профилировщиком.

Элементы управления профилировщиком
Элементы управления профилировщиком

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

  • Attach to Player - Выберите цель, на которой будет профилироваться ваше приложение. По умолчанию он установлен в режим воспроизведения (PlayMode). Вы также можете выбрать редактор (Editor) для профилирования редактора Unity и отображения ресурсов, используемых редактором в данный момент. Unity также автоматически обнаруживает любые устройства, работающие в вашей сети или подключенные через USB, и отображает их в раскрывающемся списке. Нажмите кнопку ввести IP (Click Enter IP) в раскрывающемся списке, чтобы вручную ввести IP-адрес устройства, на котором вы хотите профилировать свое приложение.
  • Record – Включите этот параметр, чтобы записывать информацию профилирования для активных модулей при запуске приложения. Если эта кнопка не включена, профилировщик не собирает никаких данных при запуске приложения.
  • Back arrow – Перейдите на один кадр назад.
  • Forward arrow Переместиться на один кадр вперед.
  • Current Frame – При нажатии кнопки текущий кадр линия индикатора кадра переходит к последнему записанному кадру, и профилировщик переходит в режим текущего кадра. В то время как профилировщик собирает данные в этом режиме, он остается на текущем кадре и отображает собранные данные в режиме реального времени. Нажмите кнопку еще раз, чтобы выйти из текущего режима кадра.
  • Frame number – Указывает номер кадра, который вы в данный момент просматриваете в Профилировщике.
  • Clear – Удалите все данные из окна профилировщика.
  • Clear on Play – Включите этот параметр, чтобы стереть все данные из окна профилировщика при следующем нажатии кнопки воспроизвести в окне проигрывателя или при подключении к новому целевому устройству.
  • Deep Profile – Включите этот параметр для профилирования всех методов C# . Когда вы включаете этот параметр, Unity позволяет более подробно исследовать ваши скрипты.
  • Call Stacks – Чтобы записать стеки вызовов для распределения памяти скриптов, щелкните этот переключатель. Кадры, которые профилировщик записывает при включении этой опции, содержат информацию в GC.
  • Load – Загрузите сохраненные данные профиля в окно профилировщика. Вы также можете загрузить двоичные данные профиля, которые игрок записал в файл с помощью Profiler.logFile API. Удерживая нажатой кнопку Shift, нажмите кнопку загрузить (Load), чтобы добавить содержимое файла к текущим рамкам профиля.
  • Save – Сохраните данные профилировщика в формате .data в папке проекта.
  • Context menu - 1. Color Blind Mode - Включите этот параметр, чтобы профилировщик использовал более контрастные цвета на своих графиках. Это улучшает видимость для пользователей с дальтонизмом (например, дейтеранопией, протанопией или тританопией). 2. Show stats for “current” frame - По умолчанию, когда вы нажимаете кнопку текущий кадр и входите в режим текущего кадра, линия индикатора кадра не имеет аннотаций со статистикой для текущего кадра. Это связано с тем, что аннотации статистики могут затруднить просмотр данных в режиме реального времени. Чтобы отобразить аннотации, включите этот параметр. 3. Preferences - Откройте меню "Настройки" (Preferences), чтобы настроить свойства конкретного профилировщика.

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

Глубокое профилирование.

Обычно профилировщик профилирует только тайминги кода, которые явно завернуты в маркеры профилей (ProfilerMarker). Это включает в себя первичную глубину стека вызовов из собственного кода движка в ваш скриптовый код, например Start, Update или аналогичные методы MonoBehaviour.

Без добавления более явного инструментария ProfilerMarker в ваш собственный код, единственные другие образцы, которые вы можете видеть, как дочерние образцы вашего скриптового кода, - это те, которые вызывают API Unity, если этот API был инструментирован. Большинство вызовов API, которые несут накладные расходы инструментируются. Например, доступ к основной камере через Camera.main API зарегистрирован как образец "FindMainCamera".

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

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

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

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

Если глубокое профилирование приводит к тому, что частота кадров вашего приложения падает настолько, что его невозможно запустить, вы можете вручную профилировать блоки кода вашего скрипта, что имеет меньшие накладные расходы, чем глубокое профилирование. Используйте ProfilerMarkers для ручного добавления инструментов, необходимых для разметки блоков скриптов. Они отображаются в модуле профилировщика использования процессора (CPU Usage).

Если вы хотите узнать, какие стеки вызовов приводят к GC.Alloc без глубокого профилирования можно включить сбор стеков вызовов распределения (Allocation call stacks). Включите параметр стеки вызовов (Call Stacks) в элементах управления профилировщика, а затем выберите GC.Alloc образцы в представлении временной шкалы или используйте панель связанных объектов (Related Objects panel) в представлении иерархии, чтобы найти стеки вызовов для этих образцов.

Модули профилировщика.

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

Модуль использования процессора (CPU Usage) обеспечивает наилучший обзор того, сколько времени ваше приложение тратит на каждый кадр. Другие модули собирают более конкретные данные и могут помочь вам проверить более конкретные области или контролировать жизненно важные показатели вашего приложения, такие как потребление памяти, рендеринг или статистика звука.

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

  • CPU Usage – Отображает, где ваше приложение проводит больше всего времени, в таких областях, как физика, скрипты, анимация и сборка мусора. Этот модуль содержит обширную профилирующую информацию о вашем приложении, и вы можете использовать ее, чтобы решить, какие дополнительные модули использовать для исследования более конкретных проблем в вашем приложении. Этот модуль всегда активен, даже если вы его закроете.
  • GPU Usage – Отображает информацию, связанную с обработкой графики. По умолчанию этот модуль не активен, так как имеет высокие накладные расходы.
  • Rendering – Отображает информацию о том, как Unity визуализирует графику в вашем приложении, включая информацию о статическом и динамическом пакетировании (static and dynamic batching), SetPass и Draw calls, треугольники (triangles) и вершины (vertices).
  • Memory – Отображает информацию о том, как Unity выделяет память в вашем приложении. Это особенно полезно для просмотра того, как ваши скрипты выделяют память (GC.Alloc), что приводит к сборке мусора или к тому, как со временем меняется использование памяти ассетов вашего приложения.
  • Audio – Отображает информацию, связанную со звуком в вашем приложении, например, когда и сколько аудиоисточников воспроизводится, сколько ЦП требуется аудиосистеме и сколько памяти выделяет Unity.
  • Video – Отображает информацию, связанную с видео в вашем приложении.
  • Physics – Отображает информацию о физике в вашем приложении, которую обработал физический движок.
  • Physics (2D) – Подобно модулю Physics Profiler, этот модуль отображает информацию о том, где физический движок обработал 2D-физику в вашем приложении.
  • Network Messages (устаревшее) – Отображает информацию о пакетах более низкого уровня и сообщениях, отправленных или полученных многопользовательским высокоуровневым API (Multiplayer high level API).
  • Network Operations (устаревшее) – Отображает детализированную информацию о том, какие типы или операции содержатся в сообщениях, отправленных и полученных многопользовательским высокоуровневым API (Multiplayer high level API), например, сколько SyncVars или команд было передано.
  • UI – Отображает информацию о том, как Unity обрабатывает пакетирование (batching) пользовательского интерфейса для вашего приложения, включая причины и способы пакетной (batching) обработки элементов Unity.
  • UI Details – Подобно модулю пользовательского интерфейса (UI Module), диаграмма этого модуля добавляет данные о пакете (batch) и количестве вершин, а также маркеры, которые включают информацию о событиях пользовательского ввода, вызывающих изменения пользовательского интерфейса.
  • Global Illumination – Отображает информацию о том, сколько ресурсов процессора Unity тратит на подсистему освещения Global Illumination в вашем приложении.

Накладные расходы модуля профилировщика.

Некоторые модули профилировщика имеют большие накладные расходы на сбор данных, такие как GPU, UI и Audio Profiler module. Чтобы эти модули не влияли на производительность вашего приложения, вы можете отключить их, сняв флажок в раскрывающемся списке модуль профилировщика (Profiler Module). Это удаляет модуль из окна, останавливает профилировщик от сбора данных этого модуля и снижает накладные расходы профилировщика.

Это не относится к модулю использования процессора (CPU Usage), который всегда собирает данные, даже когда он не активен, потому что другие модули полагаются на него.

Чтобы добавить модуль, выберите раскрывающийся список модуль профилировщика (Profiler Module) и выберите профилировщик, который вы хотите активировать. Когда вы выбираете модуль профилировщика из выпадающего списка, он начинает собирать данные, но не показывает никаких данных за период, в течение которого он не был активен.

Чтобы избежать накладных расходов модуля GPU Profiler, он по умолчанию не активен. Модуль GPU Profiler должен быть активен при запуске вашего приложения, чтобы подключиться к графическому драйверу. Если вы добавите его позже, он не будет иметь никакого эффекта на большинстве платформ, и профилировщик отобразит сообщение “профилирование GPU не поддерживается драйвером видеокарты (или оно было отключено из-за ошибок драйвера)” (“GPU profiling is not supported by the graphics card driver (or it was disabled because of driver bugs)”).

Если вы поручите профилировщику собирать и отправлять данные на диск через Profiler.logFile API вместо того, чтобы делать это через окно профилировщика, вы можете отключить модули профилировщика используя Profiler.SetAreaEnabled().

Некоторые параметры, которые отлаживают ваши скрипты через внешнюю среду IDE, также могут создавать накладные расходы. Чтобы избежать этих накладных расходов и получить более точные измерения, отключите настройку прикрепления редактора (меню: Preferences/External Tools). Аналогично, когда вы профилируете билд, откройте настройки сборки и отключите отладку скриптов, чтобы избежать этих накладных расходов.

Покадровые диаграммы профилировщика.

В верхней части окна профилировщика покадрово отображаются данные о производительности с течением времени. При запуске приложения профилировщик записывает данные для каждого кадра. По умолчанию в окне профилировщика отображается история последних 300 кадров, которые он профилирует. Вы можете увеличить количество кадров профилировщика в окне настроек максимум до 2000.

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

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

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

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

На сегодня это все. Начиная со следующей статьи, мы начнем рассматривать средства анализа, которые предоставляет Unity для отслеживания узких мест в ваших играх. Спасибо всем, кто дочитал эту статью до конца, подписывайтесь на канал, ставьте лайки, а для тех, у кого появились вопросы - спрашивайте в комментариях! А если вы хотите помочь данному каналу в развитии – делитесь этой статьей с друзьями в социальных сетях!

МОЙ КАНАЛ НА YOUTUBE | ГРУППА МОЕЙ ИНДИ ИГРЫ В VK