Система управляемой памяти Unity представляет собой среду сценариев C#, основанную на виртуальных машинах Mono или IL2CPP. Преимущество системы управляемой памяти заключается в том, что она управляет освобождением памяти, поэтому вам не нужно вручную запрашивать освобождение памяти через свой код.
Система управляемой памяти Unity использует сборщик мусора и управляемую кучу для автоматического освобождения памяти при выполнении ваших скриптовфрагмент кода, позволяющий создавать собственные компоненты, запускать игровые события, изменять Свойства компонента с течением времени и реагировать на ввод пользователя любым удобным для вас способом. Подробнее
See in Словарь больше не содержит ссылок на эти распределения. Это помогает защититься от утечек памяти. Утечки памяти происходят, когда память выделяется, ссылка на нее теряется, а затем память никогда не освобождается, поскольку для ее освобождения требуется ссылка на нее.
Эта система управления памятью также защищает доступ к памяти, а это означает, что вы не можете получить доступ к памяти, которая была освобождена или к которой ваш код никогда не мог получить доступ. Однако этот процесс управления памятью влияет на производительность во время выполнения, поскольку выделение управляемой памяти отнимает много времени у ЦП. Сборка мусора также может помешать центральному процессору выполнять другую работу, пока она не завершится.
Типы значений и ссылок
При вызове метода серверная часть сценария копирует значения его параметров в область памяти, зарезервированную для этого конкретного вызова, в структуру данных, называемую стеком вызовов. Серверная часть сценариев может быстро копировать типы данных, которые занимают несколько байтов. Однако объекты, строки и массивы обычно бывают намного больше, и для серверной части сценариев неэффективно регулярно копировать эти типы данных.
Все ненулевые ссылки- типы объектов и все упакованы объекты со значениями в управляемом коде должны размещаться в управляемой куче.
Важно, чтобы вы были знакомы со значениями и ссылочными типами, чтобы вы могли эффективно управлять своим кодом. Дополнительные сведения см. в документации Microsoft по value.types и ссылочные типы.
Автоматическое управление памятью
При создании объекта Unity выделяет память, необходимую для его хранения, из центрального пула, называемого кучей, который представляет собой раздел памяти, выбранный средой выполнения сценариев вашего проекта Unity (Mono или IL2CPP). автоматически управляет. Когда объект больше не используется, память, которую он когда-то занимал, может быть освобождена и использована для чего-то другого.
Сценарии Unity используют сборщик мусора для автоматического управления памятью вашего приложения, чтобы вам не нужно выделять и освобождать эти блоки памяти с помощью явных вызовов методов. Автоматическое управление памятью требует меньше усилий по кодированию, чем явное выделение/освобождение, и снижает вероятность утечек памяти.
Обзор управляемой кучи
Управляемая куча — это раздел памяти, которым автоматически управляет выбранная среда выполнения сценариев вашего проекта Unity (Mono или IL2CPP).

На приведенной выше диаграмме синее поле представляет объем памяти, который Unity выделяет управляемой куче. Белые прямоугольники внутри него представляют значения данных, которые Unity хранит в пространстве памяти управляемой кучи. Когда требуются дополнительные значения данных, Unity выделяет им свободное место из управляемой кучи (с аннотацией A).
Фрагментация памяти и расширение кучи

На диаграмме выше показан пример фрагментации памяти. Когда Unity освобождает объект, память, занимаемая объектом, освобождается. Однако свободное пространство не становится частью единого большого пула «свободной памяти».
Объекты по обе стороны от освобожденного объекта могут все еще использоваться. Из-за этого освободившееся место представляет собой «пробел» между другими сегментами памяти. Unity может использовать этот промежуток только для хранения данных того же или меньшего размера, чем освобожденный объект.
Эта ситуация называется фрагментацией памяти. Это происходит, когда в куче доступно большое количество памяти, но она доступна только в «промежутках» между объектами. Это означает, что даже при наличии достаточного общего пространства для выделения большого объема памяти управляемая куча не может найти достаточно большой отдельный блок непрерывной памяти для назначения выделению.

Если выделен большой объект и для его размещения недостаточно непрерывного свободного пространства, как показано выше, диспетчер памяти Unity выполняет две операции:
- Сначала запускается сборщик мусора, если он еще этого не сделал. Это пытается освободить достаточно места для выполнения запроса на выделение.
- Если после запуска сборщика мусора непрерывного пространства по-прежнему недостаточно для размещения запрошенного объема памяти, куча должна расширяться. Конкретный объем, на который расширяется куча, зависит от платформы; однако на большинстве платформ при расширении кучи она увеличивается вдвое по сравнению с предыдущим расширением.
Соображения по расширению управляемой кучи
Неожиданное расширение кучи может вызвать проблемы. Стратегия сборки мусора Unity чаще приводит к фрагментации памяти. Вы должны знать следующее:
- Unity не освобождает память, выделенную для управляемой кучи, когда она регулярно расширяется; вместо этого он сохраняет расширенную кучу, даже если большая ее часть пуста. Это сделано для предотвращения необходимости повторного расширения кучи в случае возникновения дополнительных больших выделений.
- На большинстве платформ Unity в конечном итоге освобождает память, которую используют пустые части управляемой кучи, обратно в операционную систему. Интервал, с которым это происходит, не гарантирован и ненадежен.