Привет! Сегодня разбираем инструмент, которого не должен бояться Unity разработчик — Unity Profiler. Если ты всё ещё смотришь на лаги через FPS - этот пост для тебя
Разберём как правильно пользоваться профайлером, чтобы находить проблемы, а не угадывать.
1. Главное правило профилирования - профилировать на целевом устройстве
В Editor режиме профайлер врёт. Он профайлит сам себя - таким образом попадает лишняя информация.
Если игра на мобильные устройства - собирай проект на мобильное устройство и профилируй там.
Запускай Build на устройство с опцией Development Build и Autoconnect Profiler → Profiler запустится сам → смотри реальную картину.
2. Определяем что тормозит
Вспоминаем прошлый пост - мы не хотим терять время и оптимизировать то, что не нужно.
Переходишь в Profiler → Timeline и смотришь на две строки:
• CPU — пользовательский код, работа движка, события UI, GC
• GPU — рендер, шейдеры, batching, пост-процессинг
Если CPU забит - исправляем тяжёлые функции, GC.
Если GPU забит - смотрим рендеринг - draw calls, overdraw, тяжёлые шейдеры.
3. Разворачиваем стек вызовов
Поставив полоску Timeline'а на любое место - снизу будут выведен весь стек вызова функций в конкретном кадре.
Так, мы можем посмотреть какие из функций были тяжёлыми, и оптимизировать их.
Тут многих ждёт ловушка: профайлер показывает странные функии движка вроде:
• Gfx.WaitForPresent
• WaitForTargetFPS
• WaitForLastPresentation
• Semaphore.WaitForSignal
Это не значит что эти функции надо оптимизировать.
Например, Gfx.WaitForPresent - это момент, когда CPU ждёт GPU.
Что-то вроде: "Графическая подсистема не готова принять следующий кадр - подожди"
И это значит, что твой bottleneck - GPU и оптимизировать надо его.
Описание всех подобных функций можно найти в документации.
4. Используй Deep Profile
Этот пункт будет показывать все вызовы функций, до самых глубоких функций движка.
Данных получается больше - видно абсолютно всё.
Минусы - из-за большого количества данных труднее ориентироваться и сильно нагружает устройство. Лагать игра на устройстве в таком режиме будет сильно.
Правило простое - если не получается понять проблему без режима Deep Profile - то включай.
5. Используй маркеры
Если ты знаешь, что игра у тебя лагает в какой-то конкретный промежуток - можно поставить маркеры на этот участок кода:
ProfilerMarker marker = new ProfilerMarker("MyMethod");
void Update()
{
marker.Begin();
// твой код
marker.End();
}Таким образом, в профайлере будет виден вызов "MyMethod" на выделенный маркером промежуток
6. Итог - план оптимизации
Мой порядок действий:
1. Собрать приложение на целевое устройство
2. Развернуть стек вызовов в проблемном месте
3. Определить CPU или GPU bottleneck
4. Отделить системный код от своего
5. Исправить → снова прогнать → сравнить
🚀 Пост Guru Unity: @Minerope
