Оптимизация игры на Unity: пошаговое руководство по увеличению производительности
Оптимизация игры на Unity напрямую влияет на удержание игроков и выручку. Пользователь легко прощает простую графику, но не терпит дергающийся кадр, задержки управления и резкие просадки FPS. Цель этой статьи — дать конкретные шаги, как измерить производительность, найти, что именно грузит CPU, GPU и память, и какие изменения действительно поднимают FPS без переписывания всего проекта. Материал рассчитан на инди и небольшие команды, которые делают игры и мобайл-приложения без выделенного эксперта по производительности. Вместо сухой теории вы получите практический чек-лист: что открыть в Profiler, как сократить draw calls, какие настройки графики и физики трогать в первую очередь и как выстроить процесс, чтобы оптимизировать не «на глаз», а по цифрам.

С чего начать оптимизацию игры на Unity: измеряем, а не «угадываем»
Первый импульс разработчика при лаге — «срочно упростить шейдеры или модели». Часто это не даёт ничего: игру продолжает рвать, потому что корень проблемы в загрузке текстур в середине боя или в тяжёлом Update у врагов. Без измерений вы тратите часы на правки, которые не меняют время кадра, и рискуете поломать уже стабильные части приложения.
Базовый набор инструментов Unity, с которых следует начать:
- Profiler. Вкладки CPU Usage, GPU Usage, Rendering, Memory — ваш минимум. Смотрите, сколько миллисекунд занимает кадр, какие системы дают пик, где появляются GC spikes.
- Frame Debugger. Позволяет проследить, какие материалы и объекты вызывают лишние draw calls, какие текстур и шейдеры гоняют GPU.
- Окно Stats в Game View. Следите за FPS, Batches, SetPass Calls, количеством треугольников и вершин. Если Batches растут взрывным образом при переключении экрана — уже есть направление для оптимизации.
Чтобы отличить упор в CPU от упора в GPU, используйте простые эксперименты:
- Временно выключите сложную игровую логику (AI, спавн, часть скриптов в Update). Если FPS заметно вырос — основная нагрузка на cpu-стороне, а не в рендеринге.
- Уменьшите качество графики: отключите тени, снизьте Shadow Distance, Texture Quality. Если fps резко подскочил — bottleneck в gpu и рендеринге сцене.
Не ограничивайтесь профилированием в Editor. На мощном ПК 120 FPS ничего не значат для бюджетного Android с перегретым чипом. Минимальный набор реальных устройств: слабый телефон уровня «устройство трёхлетней давности», средний по мощности и один, максимально близкий к целевой аудитории. Зафиксируйте метрики в простую таблицу: сцена → средний FPS → минимальный FPS → заметные лаги → какие изменения делали. Это превращает оптимизацию из хаоса в управляемый процесс.
Большой прирост FPS при малых усилиях: графика, сцена, физика
Частый запрос: «С чего начать, чтобы быстро поднять FPS без переписывания кода?» Ниже — перечень приёмов, которые обычно дают 20–40% выигрыша на мобильных с минимальными рисками.
Рендеринг и сцена:
- Сокращайте draw calls. Используйте Static Batching для неподвижных объектов на сцене, а для мелких динамических — Dynamic Batching или ручной Combine Mesh, если модели однотипные. Избегайте объединения всего уровня в один гигантский меш — вы ухудшите кэш и потеряете гибкость.
- Освещение. Максимум источников света переводите в baked, используйте lightmaps. Отключайте real-time тени там, где игрок их всё равно не увидит. Shadow Distance и Shadow Resolution в Quality Settings — две ручки, которые чаще всего дают заметный рост производительности.
- LOD и Occlusion Culling. Для сцен с большим количеством повторяющихся объектов внедряйте LOD Group: дальние модели с меньшим числом полигонов сокращают нагрузку на gpu почти бесплатно для визуала. Occlusion Culling имеет смысл в городских уровнях, коридорах, лесах с плотной геометрией, где много объектов постоянно скрыто.
Оптимизация UI — один из самых недооценённых источников FPS:
- Одна огромная Canvas, где каждый мелкий апдейт текста перерисовывает весь интерфейс, легко съедает до 5–10 мс на кадр. Разбейте UI на несколько Canvas по смысловым зонам и частоте обновления (HUD, меню паузы, всплывающие окна).
- Избегайте чрезмерного количества анимаций и сложных эффектов на UI, особенно на мобильных. Часто достаточно более простых анимаций или выключения их на слабых пресетах.
Физика и анимации:
- Проверьте Fixed Timestep в Project Settings → Time. Слишком маленький шаг (например, 0.005) создаёт лишнюю нагрузку, потому что физика вызывается слишком часто. Для большинства игр разумен диапазон 0.016–0.033.
- Отключайте физику там, где она не нужна: используйте isKinematic для объектов, которыми вы управляете скриптом, временно отключайте Collider у неактивных объектов.
- Меняйте Mesh Collider на примитивные коллайдеры (Box, Capsule, Sphere). Это один из самых заметных способов уменьшить количество тяжёлых расчётов.
- Если анимации простые, нет сложных переходов и blend-треков, иногда выгоднее заменить тяжёлый Animator на лёгкие анимации через скрипт или Animation Component.
Что трогать в Quality Settings в первую очередь, если вы просто хотите поднять FPS:
- Anti-Aliasing: на мобильных избегайте высоких значений, часто достаточно 2x, а на слабых устройствах лучше отключить.
- Shadow Resolution и Shadow Projection: понижайте качество и дистанцию, пока общее восприятие сцены остаётся приемлемым.
- Texture Quality и размер текстур: уменьшение вдвое часто визуально почти незаметно, но снижает использование памяти и нагрузку на gpu.
- VSync: для тестов отключайте, чтобы видеть реальный максимум FPS, но не забывайте включить обратно или ограничить fps целевым значением.
Память, сборщик мусора и ресурсы: скрытые источники лагов
Популярная жалоба: «Игра держит 60 FPS, но раз в минуту подвисает на секунду». В Profiler такие провалы часто связаны не с рендерингом, а с памятью: всплески работы GC, подгрузка ресурсов и неосторожное использование API, создающих временные объекты.
Сборщик мусора в Unity реагирует на накопление мусора из кучи. Если вы постоянно создаёте новые объекты в Update или конкатенируете строки, GC вынужден периодически останавливать мир и чистить память. Это и даёт резкие лаги.
Как уменьшить нагрузку на GC:
- Избегайте аллокаций в Update/LateUpdate/FixedUpdate. Не создавайте новые списки, строки и временные структуры на каждом кадре. По возможности выносите вычисления за пределы этих методов, используйте кэширование.
- С осторожностью используйте LINQ и boxing в горячем коде — оба часто создают скрытые аллокации.
- Внедрите Object Pooling для часто появляющихся объектов: пуль, врагов, частиц, эффектов. Создайте пул заранее и переиспользуйте элементы вместо постоянных Instantiate/Destroy.
- Кэшируйте ссылки на компоненты (Transform, Renderer и др.), а не вызывайте GetComponent или Find в каждом кадре.
Управление ассетами и загрузкой не менее важно, чем работа скриптов:
- Проверьте Import Settings для текстур и моделей: формат сжатия, размер и наличие mipmaps. Непродуманные материалы и огромные текстуры забивают память и увеличивают время загрузки сцен.
- Используйте Addressables и асинхронную загрузку вместо Resources, когда проект разросся. Подход «загружаем материалы и объекты по сценам/экранам, а ненужное выгружаем» даёт предсказуемую память и меньше провалов FPS при загрузке.
- Упаковывайте спрайты в Sprite Atlas: это уменьшает количество draw calls и ускоряет рендеринг UI.
Иногда разработчики перебарщивают с оптимизацией: качество картинки резко падает, а FPS почти не растёт. Поэтому фиксируйте метрики «до/после» и не тратьте время на микроправки, которые не дают хотя бы нескольких миллисекунд выигрыша на кадр.
Оптимизация под мобильные устройства и когда стоит привлечь команду
Мобильные платформы добавляют свои ограничения: слабый GPU, тепловой троттлинг, борьба за батарею. Часто стабильные 30 FPS лучше, чем 60 с постоянными просадками до 15. Используйте адаптивные настройки: снижайте Render Scale и качество шейдеров на старых устройствах, отключайте тяжёлые пост-эффекты, ограничивайте фоновые задачи, которые забивают сеть и cpu в самый неподходящий момент.
Если вы уже прошли базовые шаги — оптимизировали draw calls, настроили Quality Settings, внедрили пуллинг и работу с ресурсами, но проект всё равно рвётся на ключевых девайсах, стоит подумать о внешней помощи. Сигналы к этому:
- Несколько итераций оптимизации почти не двигают FPS.
- До релиза остаётся мало времени, а лаги на важных сценах сохраняются.
- Нет уверенности, что текущая архитектура выдержит рост контента и пользователей.
Наша команда как раз работает на стыке Unity-разработки и производительности: оптимизируем игры, мобильные приложения, веб-сервисы, CRM-системы, интернет-магазины. Можем провести аудит кода и ресурсов, настроить профилирование, предложить конкретные изменения в settings и архитектуре, внедрить их под ключ. Если вам нужна помощь с оптимизацией игры на Unity или с производительностью любого проекта на этом движке — напишите нам, разберём ваш случай и предложим понятный план работ по повышению FPS и снижению лагов.
