Распространяется добавочная сборка мусора (GC). процесс сборки мусора по нескольким кадрам. Это поведение сборки мусора по умолчанию в Unity.
Сборщик мусора Unity использует сборщик мусора Boehm–Demers–Weiser. По умолчанию Unity использует его в инкрементном режиме, что означает, что сборщик мусора разделяет свою рабочую нагрузку на несколько кадров вместо остановки основного потока ЦП (остановить сборку мусора) для обработки всех объектов в управляемой куче. Это означает, что Unity делает более короткие перерывы в выполнении вашего приложения вместо одного длительного перерыва, чтобы позволить сборщику мусора обработать объекты в управляемой куче.
Инкрементальный режим не ускоряет сборку мусора в целом, но поскольку он распределяет рабочую нагрузку по нескольким кадрам, пики производительности, связанные с сборкой мусора, снижаются. Эти перерывы называются всплесками GC, потому что они выглядят как большие всплески на графике времени кадра окна Profiler.
Если отключить добавочный режим (меню: Правка > Настройки проекта > Плеер > Другие настройки > Конфигурация > Использовать добавочный сборщик мусора), сборщик мусора должен проверять всю кучу при выполнении прохода сборки. Это известно как сборка мусора stop-the-world, потому что всякий раз, когда сборщик мусора запускается, он останавливает основной поток ЦП. Он возобновляет выполнение только после того, как обработает все объекты в управляемой куче, что может привести к всплескам GC, влияющим на производительность вашего приложения. Сборщик мусора также не сжимается, что означает, что Unity не перераспределяет какие-либо объекты в памяти, чтобы закрыть промежутки между объектами.
Важно! WebGLJavaScript API, который отображает 2D- и 3D-графику в веб-браузере. . Вариант сборки Unity WebGL позволяет Unity публиковать контент в виде программ JavaScript, использующих технологии HTML5 и API рендеринга WebGL для запуска контента Unity в веб-браузере. Подробнее
См. Словарь, платформа не поддерживает добавочную сборку мусора.
Если добавочная сборка мусора отключена, GC всплеск происходит, когда Unity прекращает выполнение вашего программного кода для выполнения сборки мусора. Эта задержка может длиться сотни миллисекунд, в зависимости от того, сколько выделений памяти необходимо обработать сборщику мусора, и от платформы, на которой работает ваше приложение.
Это проблематично для приложений реального времени, таких как игры, потому что вашему приложению трудно поддерживать постоянную частоту кадров, необходимую для плавной анимации, когда сборщик мусора приостанавливает выполнение вашего приложения.
Пример добавочной сборки мусора
Следующие снимки экрана из Profiler показывают, как добавочная сборка мусора уменьшает проблемы с частотой кадров:
В верхнем сеансе профилирования включена добавочная сборка мусора. Приложение имеет постоянную частоту кадров 60 кадров в секунду, потому что сборщик мусора распределяет операцию по сборке мусора на несколько кадров и использует небольшой временной интервал каждого кадра (более темная зеленая полоса прямо над желтой трассировкой вертикальной синхронизации).
В нижнем сеансе профилирования добавочный сборщик мусора отключен, и виден явный всплеск сбора мусора. Этот всплеск прерывает плавную частоту кадров 60 кадров в секунду и отодвигает кадр, в котором происходит сборка мусора, за предел в 16 мс, необходимый для поддержания 60 кадров в секунду.
Если ваше приложение использует VSync, вертикальная синхронизация (VSync) настройка дисплея, которая ограничивает частоту кадров в игре до частоты обновления монитора, чтобы предотвратить разрыв изображения.
См. в Словарь или Application.targetFrameRate, Unity корректирует время, выделяемое на сборку мусора, исходя из оставшегося доступного времени кадра. Таким образом, Unity может запустить сборку мусора за то время, которое в противном случае было бы потрачено на ожидание, и выполнить сборку мусора с минимальным влиянием на производительность.
Примечание. Если вы установите для параметра Счетчик вертикальной синхронизации значение, отличное от Не синхронизировать (в Настройки качества или с помощью свойства Application.VSync) или включить Application.targetFrameRate, Unity автоматически использует любое время простоя, оставшееся в конце заданного кадра, для добавочной сборки мусора.
Чтобы получить более точный контроль над поведением добавочной сборки мусора, вы можете использовать класс Scripting.GarbageCollector. Например, если вы не хотите использовать вертикальную синхронизацию или целевую частоту кадров, вы можете самостоятельно рассчитать время, оставшееся до окончания кадра, и предоставить это время сборщику мусора для использования.
Отключение добавочной сборки мусора
Инкрементная сборка мусора может быть проблематичной для вашего приложения, потому что, когда сборщик мусора разделяет свою работу в этом режиме, он также разделяет фазу маркировки. Фаза маркировки — это фаза, на которой сборщик мусора просматривает все управляемые объекты, чтобы определить, какие объекты все еще используются, и какие объекты он может очистить.
Разделение этапа маркировки хорошо работает, когда большая часть ссылок между объектами не меняется между частями работы. Однако при изменении ссылки на объект сборщик мусора должен снова просмотреть эти объекты на следующей итерации. Это означает, что слишком много изменений может перегрузить добавочный сборщик мусора и создать ситуацию, когда фаза маркировки никогда не завершится, потому что у нее всегда есть много работы. В этом случае сборщик мусора возвращается к полной неинкрементной сборке.
Когда Unity использует добавочную сборку мусора, он создает дополнительный код (известный как барьеры записи), чтобы информировать сборщик мусора об изменении ссылки, чтобы он знал, нужно ли повторно сканировать объект. Это увеличивает нагрузку при изменении ссылок, что влияет на производительность в управляемом коде.
Чтобы отключить добавочную сборку мусора, откройте окно настроек проигрывателя (Правка > Настройки проекта > Проигрыватель > Конфигурация) и отключите Использовать добавочную сборку мусора. Инкрементальная сборка мусора приносит пользу большинству проектов Unity, особенно если они страдают от всплесков сбора мусора, но вы всегда должны использовать Profiler. Окно, помогающее оптимизировать игру. Он показывает, сколько времени вы тратите на различные области вашей игры. Например, он может сообщать о проценте времени, затраченном на рендеринг, анимацию или игровую логику. Подробнее
Просмотрите Словарь, чтобы убедиться, что ваше приложение работает так, как вы ожидаете.