Unity 6.3
0 онлайн 25 гостей 3 в системе
Вход

Обзор сборщика мусора

Unity использует a мусорщик восстановить память от объектов, которые ваше приложение и Unity Когда скрипт пытается сделать выделение на управляемой куче, но нет достаточно свободной памяти кучи, чтобы разместить выделение, Unity запускает сборщик мусора.

При запуске сборщика мусора, он проверяет все объекты в управляемой кучи, и помечает для удаления любые объекты, на которые ваше приложение больше не ссылается. Unity затем удаляет объекты без ссылки, что высвобождает память. В идеале высвобожденная память может затем принять новое выделение, а если это не возможно, куча растет, и Unity выделяет дополнительные блоки памяти для нее.

Когда сборщик мусора перераспределяет память

Коллектор мусора обрабатывает последующие запросы таким же образом, пока не останется свободного места, достаточного для выделения требуемого размера блока. В этой ситуации маловероятно, что вся выделенная память все еще используется. Скриптовые backends Unity могут получить доступ к элементу ссылки на куче только до тех пор, пока существуют переменные ссылки, которые могут его найти.

Чтобы определить, какие блоки стека больше не используются, сборщик мусора ищет по всем активным переменным ссылок и помечает блоки памяти, на которые они ссылаются, как живые. В конце поиска сборщик мусора считает любое пространство между живыми блоками пустым и помечает их для использования в последующих распределениях. Процесс обнаружения и высвобождения неиспользуемой памяти называется сборка мусора (GC).

Примечание: Сборщик мусора работает по-другому на веб-платформе. Дополнительные сведения см. в Память в сборе мусора на веб-платформе.

Временные ассигнования

Это обычное для приложения, чтобы выделить временные данные для управляемая куча в каждом кадре, но временные распределения могут повлиять на производительность приложения.

Например, если программа выделяет 1 KB временной памяти на каждый кадр, и она работает на частоте 60 кадров в секунду, то она должна выделять 60 KB временной памяти в секунду. За минуту это добавляет до 3.6 MB памяти, доступной для сборщика мусора.

Вызов сборщика мусора один раз в секунду негативно влияет на производительность. Если ему придется очистить 3.6 MB, распределенные по тысячам индивидуальных выделений, это может привести к значительному увеличению времени сбора мусора.

Операции загрузки влияют на производительность. Если ваше приложение генерирует много временных объектов во время операции загрузки ассетов, и Unity ссылается на эти объекты до завершения операции, то сборщик мусора не может освободить эти временные объекты. Это означает, что управляемая куча должна расширяться, даже если Unity освободит много объектов, которые она содержит, через некоторое время.

Чтобы избежать расширения управляемого стека, уменьшите количество часто повторяющихся выделений управляемого стека настолько, насколько это возможно: в идеале до 0 байт на кадр или как можно ближе к нулю. Информацию об оптимизации для выделений управляемого стека см. в Оптимизация кода для управляемой памяти.

Дополнительные ресурсы