Unity использует сборщик мусора для освобождения памяти. из объектов, которые ваше приложение и Unity больше не используют. Когда скрипт пытается выделить память в управляемой куче, но свободной памяти в куче недостаточно для размещения этой памяти, Unity запускает сборщик мусора. Когда сборщик мусора запускается, он проверяет все объекты в куче и помечает для удаления все объекты, на которые ваше приложение больше не ссылается. Затем Unity удаляет объекты, на которые нет ссылок, освобождая память.
Сборщик мусора обрабатывает последующие запросы таким же образом, пока не останется свободной области, достаточно большой для выделения требуемого размера блока. В этой ситуации маловероятно, что вся выделенная память все еще используется. бэкенды сценариев UnityСреда, обеспечивающая работу сценариев в Unity. Unity поддерживает три различных бэкэнда для сценариев в зависимости от целевой платформы: Mono, .NET и IL2CPP. Однако универсальная платформа Windows поддерживает только два: .NET и IL2CPP. Дополнительная информация
See in Словарь может получить доступ только к элементу ссылки в куче, если есть по-прежнему являются ссылочными переменными, которые могут найти его. Если все ссылки на блок памяти отсутствуют (если ссылочные переменные были переназначены или если они являются локальными переменными, которые теперь находятся вне области действия), то сборщик мусора может перераспределить занимаемую им память.
Чтобы определить, какие блоки кучи больше не используются, сборщик мусора просматривает все активные ссылочные переменные и помечает блоки памяти, которые он называет «активными». По окончании поиска сборщик мусора считает любое пространство между «живыми» блоками пустым и помечает их для использования при последующих выделениях. Процесс обнаружения и освобождения неиспользуемой памяти называется сборкой мусора (GC).
Примечание. Сборщик мусора работает по-разному в WebGLJavaScript API, который отображает 2D и 3D графика в веб-браузере. Вариант сборки Unity WebGL позволяет Unity публиковать контент в виде программ JavaScript, использующих технологии HTML5 и API рендеринга WebGL для запуска контента Unity в веб-браузере. Подробнее
См. в Словарь. Дополнительные сведения см. в разделе Соображения по сборке мусора.
В Unity сборщик мусора имеет следующие режимы:
- Инкрементная сборка мусора: включена по умолчанию (Настройки проекта > Плеер > Конфигурация), этот режим расширяет процесс сборки мусора. в нескольких кадрах.
- Инкрементная сборка мусора отключена: если вы отключите настройку проигрывателя Incremental GC, сборщик мусора прекратит выполнение вашего приложения для проверки и обрабатывать объекты в куче.
- Отключить автоматическую сборку мусора: используйте API GarbageCollector.GCMode. чтобы полностью контролировать, когда Unity должна запускать сборщик мусора.
Отслеживание распределения
В Unity есть следующие инструменты для отслеживания распределения памяти:
- Модуль использования ЦП Unity Profiler: предоставляет сведения о выделении GC Alloc для каждого кадра .
- Модуль памяти Unity Profiler: обеспечивает высокий уровень использования памяти кадр за кадром
- Пакет Memory Profiler: отдельный пакет Unity, предоставляющий подробную информацию о памяти. использование во время определенных кадров в вашем приложении
В модуле "Использование ЦП" представление "Иерархия" содержит столбец GC Alloc. В этом столбце отображается количество байтов, выделенных Unity в управляемой куче в определенном кадре. Он также отображает объем памяти, которой управлял сборщик мусора, и включает память, которую Unity могла выделить и повторно использовать в последующих кадрах. Это означает, что сумма GC Alloc по всем кадрам не равна сумме увеличения управляемой памяти за это время.
Чтобы получить наиболее точную информацию, вы всегда должны профилировать свое приложение в сборке для разработкиСборка для разработки включает символы отладки и включает Профилировщик. Подробнее
См. Словарь на целевой платформе или устройстве, для которого вы хотите выполнить сборку. Редактор Unity работает иначе, чем сборка, и это влияет на данные профилирования; например, метод GetComponent
всегда выделяет память при выполнении в редакторе, но не в построенном проекте.
Вы также можете использовать режим стеков вызовов в Profiler. Окно, помогающее оптимизировать игру. Он показывает, сколько времени вы тратите на различные области вашей игры. Например, он может сообщать о проценте времени, затраченном на рендеринг, анимацию или игровую логику. Подробнее
См. в Словарь, чтобы определить, каким методом происходит распределение. Вы можете включить полные трассировки стека вызовов для образцов GC.Alloc, которые затем помогают определить, где и когда запускался сборщик мусора.