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

Память в Unity введение

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

Unity использует следующие уровни управления памятью для обработки памяти в вашем приложении:

  • Управляемая память: Контролируемый слой памяти, который использует управляемую кучу и сборщик мусора для автоматического выделения и назначения памяти.
  • C# неуправляемая память: Уровень управления памятью, который можно использовать с пространством имен Unity.Collections, пакетом Коллекциии через UnsafeUtility.Malloc и UnsafeUtility.Free. Этот тип памяти называется неуправляемой, потому что он не использует сборщик мусора для отслеживания и управления, когда память перестает использоваться, но требует, чтобы ваш код явно управлял и высвобождал память сам, вызов Dispose на коллекции или Free на памяти, выделенной с UnsafeUtility.Malloc.
  • Внутренняя память: C++ память, которую Unity использует для запуска движка. Она содержит память, связанную с такими областями, как память, используемая для ассетов в вашем проекте, и менеджеры для различных внутренних подсистем Unity, таких как системы рендеринга или анимации. В большинстве случаев вы не можете получить доступ к этой памяти через код C#, но поскольку это обычно самая большая часть посадочного места памяти вашего приложения, полезно знать об этом, если вы хотите оптимизировать использование памяти вашим приложением.

Примечание: Вы можете использовать Память Profiler пакет для анализа использования памяти.

Управление памятью

Mono и IL2CPP виртуальные машины скриптов (VM) реализуют систему управляемой памяти, которую иногда называют системой памяти скриптов. VM даёт контролируемое окружение памяти, разделённое на следующие типы:

  • Управляемая куча: Секция памяти, которую VM автоматически контролирует с мусорщик.
  • Скриптовый стек: Этот стек создается и разворачивается по мере того, как приложение входит и выходит из любой области кода.
  • Основная память VM: Содержит память, связанную со слоем скриптов Unity.

Использование управляемой памяти в Unity является самым простым способом управления памятью в вашем приложении, но у него есть некоторые недостатки. Garbage collector удобен в использовании, но он также непредсказуем в том, как он высвобождает и выделяет память, что может привести к проблемам производительности, таким как зависание, которое происходит, когда garbage collector должен остановиться, чтобы высвободить и выделить память. Чтобы обойти эту непредсказуемость, вы можете использовать C# неуправляемый слой памяти.

Дополнительные сведения о работе управляемой памяти см. в разделе Управляемая память.

C# неуправляемая память

Неуправляемый слой памяти C# позволяет получить доступ к слою собственной памяти для точной настройки распределения памяти, с удобством написания кода C#.

Вы можете использовать пространство имен Unity.Collections (включая NativeArray) в ядре Unity API, структуры данных в пакете коллекций Unityи UnsafeUtility.Malloc и UnsafeUtility.Free для доступа к неуправляемой памяти C#.

Если вы используете реализованную в Unity систему заданий или Burst, необходимо работать с неуправляемой памятью C#. Кроме того, для использования Burst разрешены только контейнеры из пространства имён Unity.Collections или типы, удовлетворяющие ограничению C# unmanaged.

Основной код Unity, а иногда и его основные распределители, выделяют память, доступную для C# через эти APIs. Из-за этого инструменты, такие как Память Profiler group C# неуправляемая память вместе с основной памятью.

Внутренняя память

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

Сцены проекта, ассеты, графические API, графические драйверы, подсистемы, буферы плагинов и выделения памяти Unity хранит в нативной памяти. Это значит, что обращаться к ней и безопасно работать с данными приложения можно опосредованно — через C#-API Unity, получая при этом преимущества нативного и эффективного кода внутреннего ядра на C/C++.

В большинстве случаев вам не придется взаимодействовать с Unity’s нативный памяти, но вы можете проверить, как это влияет на производительность вашего приложения, когда вы используете Profiler, через Profiler маркеры. Вы можете также отрегулировать представление вашего применения путем изменять установки на ваших ассетах и через настраиваемые установки для UnityДля получения дополнительных сведений см. Распределители памяти.

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