Artean

Оптимизация игры на Unity: пошаговое руководство по увеличению производительности

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

Оптимизация игры на Unity: как поднять FPS и снизить лаги

С чего начать оптимизацию игры на Unity: измеряем, а не «угадываем»

Первый импульс разработчика при лаге — «срочно упростить шейдеры или модели». Часто это не даёт ничего: игру продолжает рвать, потому что корень проблемы в загрузке текстур в середине боя или в тяжёлом Update у врагов. Без измерений вы тратите часы на правки, которые не меняют время кадра, и рискуете поломать уже стабильные части приложения.

Базовый набор инструментов Unity, с которых следует начать:

  1. Profiler. Вкладки CPU Usage, GPU Usage, Rendering, Memory — ваш минимум. Смотрите, сколько миллисекунд занимает кадр, какие системы дают пик, где появляются GC spikes.
  2. Frame Debugger. Позволяет проследить, какие материалы и объекты вызывают лишние draw calls, какие текстур и шейдеры гоняют GPU.
  3. Окно Stats в Game View. Следите за FPS, Batches, SetPass Calls, количеством треугольников и вершин. Если Batches растут взрывным образом при переключении экрана — уже есть направление для оптимизации.

Чтобы отличить упор в CPU от упора в GPU, используйте простые эксперименты:

  1. Временно выключите сложную игровую логику (AI, спавн, часть скриптов в Update). Если FPS заметно вырос — основная нагрузка на cpu-стороне, а не в рендеринге.
  2. Уменьшите качество графики: отключите тени, снизьте Shadow Distance, Texture Quality. Если fps резко подскочил — bottleneck в gpu и рендеринге сцене.

Не ограничивайтесь профилированием в Editor. На мощном ПК 120 FPS ничего не значат для бюджетного Android с перегретым чипом. Минимальный набор реальных устройств: слабый телефон уровня «устройство трёхлетней давности», средний по мощности и один, максимально близкий к целевой аудитории. Зафиксируйте метрики в простую таблицу: сцена → средний FPS → минимальный FPS → заметные лаги → какие изменения делали. Это превращает оптимизацию из хаоса в управляемый процесс.

Большой прирост FPS при малых усилиях: графика, сцена, физика

Частый запрос: «С чего начать, чтобы быстро поднять FPS без переписывания кода?» Ниже — перечень приёмов, которые обычно дают 20–40% выигрыша на мобильных с минимальными рисками.

Рендеринг и сцена:

  1. Сокращайте draw calls. Используйте Static Batching для неподвижных объектов на сцене, а для мелких динамических — Dynamic Batching или ручной Combine Mesh, если модели однотипные. Избегайте объединения всего уровня в один гигантский меш — вы ухудшите кэш и потеряете гибкость.
  2. Освещение. Максимум источников света переводите в baked, используйте lightmaps. Отключайте real-time тени там, где игрок их всё равно не увидит. Shadow Distance и Shadow Resolution в Quality Settings — две ручки, которые чаще всего дают заметный рост производительности.
  3. LOD и Occlusion Culling. Для сцен с большим количеством повторяющихся объектов внедряйте LOD Group: дальние модели с меньшим числом полигонов сокращают нагрузку на gpu почти бесплатно для визуала. Occlusion Culling имеет смысл в городских уровнях, коридорах, лесах с плотной геометрией, где много объектов постоянно скрыто.

Оптимизация UI — один из самых недооценённых источников FPS:

  1. Одна огромная Canvas, где каждый мелкий апдейт текста перерисовывает весь интерфейс, легко съедает до 5–10 мс на кадр. Разбейте UI на несколько Canvas по смысловым зонам и частоте обновления (HUD, меню паузы, всплывающие окна).
  2. Избегайте чрезмерного количества анимаций и сложных эффектов на UI, особенно на мобильных. Часто достаточно более простых анимаций или выключения их на слабых пресетах.

Физика и анимации:

  1. Проверьте Fixed Timestep в Project Settings → Time. Слишком маленький шаг (например, 0.005) создаёт лишнюю нагрузку, потому что физика вызывается слишком часто. Для большинства игр разумен диапазон 0.016–0.033.
  2. Отключайте физику там, где она не нужна: используйте isKinematic для объектов, которыми вы управляете скриптом, временно отключайте Collider у неактивных объектов.
  3. Меняйте Mesh Collider на примитивные коллайдеры (Box, Capsule, Sphere). Это один из самых заметных способов уменьшить количество тяжёлых расчётов.
  4. Если анимации простые, нет сложных переходов и blend-треков, иногда выгоднее заменить тяжёлый Animator на лёгкие анимации через скрипт или Animation Component.

Что трогать в Quality Settings в первую очередь, если вы просто хотите поднять FPS:

  1. Anti-Aliasing: на мобильных избегайте высоких значений, часто достаточно 2x, а на слабых устройствах лучше отключить.
  2. Shadow Resolution и Shadow Projection: понижайте качество и дистанцию, пока общее восприятие сцены остаётся приемлемым.
  3. Texture Quality и размер текстур: уменьшение вдвое часто визуально почти незаметно, но снижает использование памяти и нагрузку на gpu.
  4. VSync: для тестов отключайте, чтобы видеть реальный максимум FPS, но не забывайте включить обратно или ограничить fps целевым значением.

Память, сборщик мусора и ресурсы: скрытые источники лагов

Популярная жалоба: «Игра держит 60 FPS, но раз в минуту подвисает на секунду». В Profiler такие провалы часто связаны не с рендерингом, а с памятью: всплески работы GC, подгрузка ресурсов и неосторожное использование API, создающих временные объекты.

Сборщик мусора в Unity реагирует на накопление мусора из кучи. Если вы постоянно создаёте новые объекты в Update или конкатенируете строки, GC вынужден периодически останавливать мир и чистить память. Это и даёт резкие лаги.

Как уменьшить нагрузку на GC:

  1. Избегайте аллокаций в Update/LateUpdate/FixedUpdate. Не создавайте новые списки, строки и временные структуры на каждом кадре. По возможности выносите вычисления за пределы этих методов, используйте кэширование.
  2. С осторожностью используйте LINQ и boxing в горячем коде — оба часто создают скрытые аллокации.
  3. Внедрите Object Pooling для часто появляющихся объектов: пуль, врагов, частиц, эффектов. Создайте пул заранее и переиспользуйте элементы вместо постоянных Instantiate/Destroy.
  4. Кэшируйте ссылки на компоненты (Transform, Renderer и др.), а не вызывайте GetComponent или Find в каждом кадре.

Управление ассетами и загрузкой не менее важно, чем работа скриптов:

  1. Проверьте Import Settings для текстур и моделей: формат сжатия, размер и наличие mipmaps. Непродуманные материалы и огромные текстуры забивают память и увеличивают время загрузки сцен.
  2. Используйте Addressables и асинхронную загрузку вместо Resources, когда проект разросся. Подход «загружаем материалы и объекты по сценам/экранам, а ненужное выгружаем» даёт предсказуемую память и меньше провалов FPS при загрузке.
  3. Упаковывайте спрайты в Sprite Atlas: это уменьшает количество draw calls и ускоряет рендеринг UI.

Иногда разработчики перебарщивают с оптимизацией: качество картинки резко падает, а FPS почти не растёт. Поэтому фиксируйте метрики «до/после» и не тратьте время на микроправки, которые не дают хотя бы нескольких миллисекунд выигрыша на кадр.

Оптимизация под мобильные устройства и когда стоит привлечь команду

Мобильные платформы добавляют свои ограничения: слабый GPU, тепловой троттлинг, борьба за батарею. Часто стабильные 30 FPS лучше, чем 60 с постоянными просадками до 15. Используйте адаптивные настройки: снижайте Render Scale и качество шейдеров на старых устройствах, отключайте тяжёлые пост-эффекты, ограничивайте фоновые задачи, которые забивают сеть и cpu в самый неподходящий момент.

Если вы уже прошли базовые шаги — оптимизировали draw calls, настроили Quality Settings, внедрили пуллинг и работу с ресурсами, но проект всё равно рвётся на ключевых девайсах, стоит подумать о внешней помощи. Сигналы к этому:

  1. Несколько итераций оптимизации почти не двигают FPS.
  2. До релиза остаётся мало времени, а лаги на важных сценах сохраняются.
  3. Нет уверенности, что текущая архитектура выдержит рост контента и пользователей.

Наша команда как раз работает на стыке Unity-разработки и производительности: оптимизируем игры, мобильные приложения, веб-сервисы, CRM-системы, интернет-магазины. Можем провести аудит кода и ресурсов, настроить профилирование, предложить конкретные изменения в settings и архитектуре, внедрить их под ключ. Если вам нужна помощь с оптимизацией игры на Unity или с производительностью любого проекта на этом движке — напишите нам, разберём ваш случай и предложим понятный план работ по повышению FPS и снижению лагов.