Оптимизация производительности в Unity начинается не с отключения теней и не с уменьшения качества текстур, а с поиска реального узкого места. В этой статье разберём практический порядок работы: как найти проблему через Profiler, снизить нагрузку на CPU и GPU, уменьшить draw calls и лишние аллокации, настроить LOD, память и Object Pooling. Материал актуализирован с учётом современных подходов Unity 6.
Сначала найдите узкое место
Не стоит оптимизировать проект вслепую. Сначала запустите сборку на целевом устройстве и посмотрите, что именно ограничивает производительность: CPU, GPU, память, физика, UI или рендеринг. Производительность в редакторе может заметно отличаться от готовой сборки.
Для базовой диагностики используйте Unity Profiler. Если проблема связана с рендерингом, подключайте Frame Debugger; для сравнения нескольких профилей удобен Profile Analyzer, а для поиска проблем с памятью — Memory Profiler. После каждого заметного изменения измеряйте результат повторно в той же сцене и на том же устройстве.
Графика: LOD, draw calls, текстуры и освещение
Используйте Level of Detail (LOD)
LOD позволяет загружать модели разной детализации в зависимости от расстояния до камеры. Это снижает нагрузку на GPU.
Пример настройки LOD:
- Импортируйте 3D модель с несколькими уровнями детализации.
- Добавьте компонент LOD Group к объекту.
- Настройте расстояния для переключения между уровнями.
Снизьте количество полигонов и текстур
- Используйте Texture Atlases для объединения текстур и уменьшения количества draw calls.
- Используйте платформенные настройки импорта текстур: ASTC обычно подходит для современных мобильных устройств, ETC2 — как более совместимый вариант, а на ПК применяются BC-форматы. Проверяйте Max Size, mip maps и реальное потребление памяти, а не только размер файла на диске.
Сократите draw calls и SetPass
Большое количество объектов и материалов может создавать заметную нагрузку на CPU ещё до того, как кадр попадёт на GPU. Следите за Batches и SetPass Calls, используйте SRP Batcher, GPU Instancing или подходящий вид батчинга там, где это действительно уменьшает стоимость рендеринга. Проверить, почему объекты не объединяются, удобно через Frame Debugger.
Запекайте статичное освещение
Предварительный расчёт света (light baking) уменьшает нагрузку на CPU и GPU, так как освещение становится статичным.
- Откройте вкладку Lighting.
- Включите Baked Global Illumination.
- Выберите объекты, которые должны быть статичными, и установите флаг Static.
Скрипты и CPU: что оптимизировать в коде
Уменьшите количество вызовов Update()
Сам по себе метод Update() не является проблемой. Нагрузка появляется, когда сотни или тысячи компонентов выполняют тяжёлую работу каждый кадр. Сначала найдите такие вызовы в Profiler, а затем уменьшайте частоту ненужных проверок:
- Для событийной логики используйте события и вызовы по факту изменения состояния вместо постоянного опроса каждый кадр.
- Редкие проверки можно выполнять по таймеру или корутиной, если им действительно не нужна частота каждого кадра.
Пример корутины вместо Update():
private void Start() {
StartCoroutine(CheckPlayerPosition());
}
private IEnumerator CheckPlayerPosition() {
while (true)
{
// Выполняем проверку раз в 0.5 секунды
if (Vector3.Distance(transform.position, player.position) < 5f)
{
Debug.Log("Игрок рядом!");
}
yield return new WaitForSeconds(0.5f);
}
}Кэшируйте часто используемые ссылки
GetComponent<> не нужно считать «запрещённым», но нет смысла многократно искать один и тот же компонент в Update() или другом горячем участке кода. Если ссылка используется постоянно, получите её один раз и сохраните:
private Rigidbody rb;
void Start() {
rb = GetComponent<Rigidbody>();
}
void FixedUpdate() {
rb.AddForce(Vector3.up * 10f);
}Память и Garbage Collection
Используйте Object Pooling
Object Pooling — техника повторного использования объектов вместо постоянных Instantiate и Destroy. Она особенно полезна для пуль, врагов, частиц и других объектов, которые часто появляются и исчезают. В современных версиях Unity можно использовать встроенные API из пространства имён UnityEngine.Pool, хотя простой собственный пул тоже подходит для небольших проектов.
Пример Object Pooling для пуль:
public class ObjectPool : MonoBehaviour {
public GameObject prefab;
private Queue<GameObject> pool = new Queue<GameObject>();
public GameObject GetObject() {
if (pool.Count > 0)
{
var obj = pool.Dequeue();
obj.SetActive(true);
return obj;
}
return Instantiate(prefab);
}
public void ReturnObject(GameObject obj) {
obj.SetActive(false);
pool.Enqueue(obj);
}
}Используйте GetObject() для получения объекта и ReturnObject() для возвращения.
Следите за Garbage Collection (GC)
Частые managed-аллокации постепенно приводят к запуску Garbage Collector и могут создавать заметные скачки времени кадра. Чтобы уменьшить количество лишних выделений памяти:
- Избегайте лишней боксовки, временных строк, LINQ и других аллокаций внутри часто вызываемых участков кода.
- Если примерный объём данных известен заранее, задавайте ёмкость списков и повторно используйте коллекции вместо постоянного создания новых.
- Используйте пул объектов вместо создания новых.
Оптимизация под мобильные устройства и XR
Для мобильных устройств
- Используйте максимально простые шейдеры, которые дают нужный визуальный результат. В URP часто стоит начать с Simple Lit или Unlit и усложнять материал только при необходимости.
- Сократите использование частиц и пост-эффектов.
- Сокращайте дальность, разрешение и количество realtime-теней, если Profiler показывает, что они заметно влияют на GPU.
Оптимизация для XR (VR/AR)
- Уменьшите количество draw calls с помощью статического батчинга.
- Ориентируйтесь на целевую частоту обновления конкретного XR-устройства и контролируйте время кадра: требования отличаются между гарнитурами и режимами работы.
- Используйте Occlusion Culling, чтобы рендерить только видимые объекты.
Профилирование и проверка результата
Profiler и Frame Debugger
Unity Profiler позволяет увидеть, где реально тратится время кадра и память. Для более точных выводов профилируйте Development Build на целевом устройстве: показатели внутри Editor полезны для первичной диагностики, но не всегда совпадают с готовой сборкой.
- Откройте Window > Analysis > Profiler.
- Запустите нужную сцену и сравните CPU, GPU, Rendering и Memory. Для проблем с draw calls используйте Frame Debugger, для памяти — Memory Profiler, а Profile Analyzer поможет сравнить несколько замеров.
Визуализация статистики
Панель Stats в Game View удобна для быстрой оценки Batches, SetPass Calls, треугольников и FPS, но она не заменяет полноценное профилирование. Для сравнения производительности полезно смотреть и на время кадра в миллисекундах.
Оптимизируйте итерациями
- Зафиксируйте исходные показатели в конкретной сцене.
- Найдите главный bottleneck в Profiler.
- Измените одну группу настроек или один участок кода.
- Повторите замер в тех же условиях и оставьте изменение только если оно действительно помогло.
Заключение: оптимизируйте по данным, а не наугад
Оптимизация Unity даёт лучший результат, когда начинается с измерений. Сначала определите, ограничена ли сцена CPU, GPU или памятью, затем исправляйте самый дорогой участок и снова измеряйте результат. Такой подход обычно эффективнее, чем массово снижать качество графики «на всякий случай».
Частые вопросы
С чего начинать оптимизацию Unity?
С профилирования сборки на целевом устройстве. Unity Profiler покажет, где тратится время кадра, а Frame Debugger и Memory Profiler помогут точнее разобраться с рендерингом и памятью.
Что сильнее влияет на FPS — CPU или GPU?
Единого ответа нет. Одна сцена может упираться в скрипты, физику или draw calls на CPU, другая — в шейдеры, тени, разрешение и overdraw на GPU. Поэтому сначала нужно определить bottleneck, а уже потом выбирать способ оптимизации.
Нужно ли использовать Object Pooling для всех объектов?
Нет. Пул имеет смысл прежде всего для объектов, которые часто создаются и уничтожаются во время игры. Для редких объектов он может только усложнить код без заметной пользы.
Что почитать дальше
Если проект запускается в браузере, посмотрите материал «Особенности оптимизации для браузерных игр на Unity». Перед релизом также полезен материал «Как тестировать игры перед релизом».
Больше материалов о Unity и разработке игр — в Telegram HAKSTER.

