← Назад к вопросам

Что такое Incremental garbage collection?

2.8 Senior🔥 42 комментариев
#Оптимизация#Управление памятью

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое Incremental Garbage Collection?

Incremental garbage collection (инкрементальная сборка мусора) — это оптимизированный подход к автоматическому управлению памятью в средах выполнения, таких как Unity Engine, где традиционная stop-the-world сборка приостанавливает выполнение основного потока приложения на время всей процедуры очистки, вызывая заметные фризы (зависания) кадров. Инкрементальный GC, представленный в Unity 2019.x и активно развиваемый в последующих версиях, решает эту проблему, разбивая работу сборщика мусора на множество мелких этапов, выполняемых в течение нескольких кадров.

Как работает традиционный vs. инкрементальный GC

Традиционный подход (Stop-the-World):

  • Сборщик полностью останавливает выполнение управляемого кода (например, C# скриптов).
  • Проходит все фазы (маркировка, очистка, компрессия) за одну операцию.
  • Вызывает просадки FPS, особенно при большом объёме управляемой памяти.

Инкрементальный подход:

  • Работа GC делится на небольшие инкременты (шаги).
  • Каждый шаг выполняется в рамках выделенного бюджета времени (например, 1-2 мс за кадр).
  • Между шагами приложение продолжает работу, что сглаживает нагрузку на CPU.

Ключевые компоненты Incremental GC в Unity

  1. Поколения памяти (Generations). Unity использует Boehm-Demers-Weiser garbage collector с поколениями:
    *   **Gen 0**: Краткосрочные объекты (созданные в текущем кадре).
    *   **Gen 1**: Промежуточные объекты.
    *   **Gen 2**: Долгоживущие объекты.
    Инкрементально обрабатываются обычно **Gen 0 и Gen 1**, так как они меняются чаще.

  1. Фазы инкрементальной сборки:
    *   **Маркировка (Marking)**: Обход графа живых объектов. Эта фаза разбивается на шаги.
    *   **Очистка (Sweeping)**: Освобождение памяти, занятой неотмеченными (мёртвыми) объектами.
    *   **Компрессия (Compaction, не всегда инкрементальна)**: Перераспределение объектов для уменьшения фрагментации.

Преимущества и недостатки

Преимущества:

  • Устранение резких фризов: Основное преимущество. Плавность геймплея и UI критична для игр.
  • Предсказуемость: Работу GC можно вписать в бюджет времени кадра.
  • Лучший опыт на мобильных устройствах: Где ресурсы CPU ограничены, а плавность кадров важна.

Недостатки и ограничения:

  • Общий overhead может быть выше: Из-за накладных расходов на разделение работы общее время, потраченное на GC за период, может увеличиться.
  • Не вся работа инкрементальна: Некоторые операции (например, полная сборка Gen 2 или дефрагментация) могут потребовать блокировки.
  • Требует настройки: Неправильные бюджет времени или частотность триггеров GC могут снизить эффективность.

Практическое использование в Unity

Инкрементальный GC включается в Player Settings (до Unity 2020.3 требуется явное включение в экспериментальных настройках):

// Пример кода, который может ухудшить работу даже инкрементального GC:
void Update() {
    // ПЛОХО: Создание множества краткосрочных объектов каждый кадр
    string debugText = "Score: " + score + " Time: " + Time.time;
    List<Vector3> tempList = new List<Vector3>(1000);

    // ХОРОШО: Использование пулов для часто создаваемых объектов
    GameObject bullet = ObjectPool.Instance.Get();
    bullet.transform.position = firePoint.position;
}

Рекомендации для разработчиков:

  • Настройте бюджет GC в Project Settings > Player > Other Settings > Configuration > Garbage Collection (значение Incremental GC Budget).
  • Минимизируйте аллокации в runtime: Используйте пулы объектов, кэшируйте ссылки, избегайте LINQ и боксинга в частых методах вроде Update().
  • Контролируйте триггеры сборки: Вызывайте System.GC.Collect() вручную в контролируемых моментах (например, при загрузке уровня), если это необходимо.
  • Мониторьте через Profiler: Инструмент Unity Profiler (вкладка CPU) позволяет увидеть шаги инкрементального GC и их влияние на кадр.

Заключение

Incremental garbage collection — это важный шаг в эволюции Unity, направленный на решение одной из самых болезненных проблем производительности — фризов из-за сборки мусора. Хотя он не отменяет необходимости писать памят-эффективный код, он кардинально меняет характер проблемы с резких, разрушающих впечатление игрока, пауз на менее заметные, распределённые по времени микро-задержки. Для современной игры, особенно таргетированной на мобильные платформы или VR/AR, использование и правильная настройка инкрементального GC является стандартом де-факто. Однако, важно помнить, что это компромисс, и его эффективность напрямую зависит от дисциплины разработчика в управлении аллокациями памяти.