
Чтобы ваше приложение работало без проблем с производительностью, важно понимать, как Unity использует и распределяет память. Этот раздел документации объясняет, как работает память в Unity, и предназначен для читателей, которые хотят понять, как они могут улучшить производительность памяти в своем приложении.
Unity использует три уровня управления памятью для управления памятью в вашем приложении:
- Управляемая память: контролируемый уровень памяти, использующий управляемую кучу и сборщик мусора для автоматического выделения и назначения памяти.
- Неуправляемая память C#: уровень управления памятью, который можно использовать в сочетании с пространством имен и пакетом Unity Collections. Этот тип памяти называется «неуправляемым», поскольку он не использует сборщик мусора для управления неиспользуемыми частями памяти.
- Собственная память: память C++, которую Unity использует для запуска движка. В большинстве случаев эта память недоступна для пользователей Unity, но знать об этом полезно, если вы хотите точно настроить определенные аспекты производительности вашего приложения.
Управляемая память
Виртуальные машины сценариев (ВМ) Mono и IL2CPP реализуют систему управляемой памяти, которую иногда называют системой памяти сценариев. Эти виртуальные машины предлагают управляемую среду памяти, разделенную на следующие типы:
-
Управляемая куча: раздел памяти, который ВМ автоматически контролирует с помощью сборщика мусора (GC). По этой причине память, выделенная в управляемой куче, называется распределением GC. Окно Profiler поможет вам оптимизировать игру. Он показывает, сколько времени вы тратите на различные области вашей игры. Например, он может сообщать о проценте времени, затраченном на рендеринг, анимацию или игровую логику. Подробнее
См. в записях Словарь любое появление такого распределения как GC .Alloc образец. - Стек сценариев. Он создается и раскручивается по мере того, как ваше приложение входит в любую область кода и выходит из нее.
- Собственная память ВМ: содержит память, связанную со слоем сценариев Unity. В большинстве случаев вам не нужно манипулировать собственной памятью виртуальной машины, но полезно знать, что она включает в себя память, связанную с исполняемым кодом, который генерирует ваш код, в частности, с использованием generics, введите метаданные, которые Reflection использует и память, необходимая для запуска виртуальной машины.
Поскольку система управляемой памяти использует виртуальные машины, она имеет контролируемую среду, которая автоматически отслеживает ссылки на выделения для управления их временем жизни. Это означает, что меньше вероятность того, что ваше приложение освободит память слишком рано, пока другой код пытается получить к ней доступ. Это также означает, что у вас есть некоторая защита от утечек памяти, которые происходят, когда память недоступна из кода или из-за накопления неиспользуемой памяти.
Использование управляемой памяти в Unity — это самый простой способ управления памятью в вашем приложении; но у него есть некоторые недостатки. Сборщик мусора удобен в использовании, но он также непредсказуем в том, как он освобождает и выделяет память, что может привести к проблемам с производительностью, таким как заикание, которое происходит, когда сборщику мусора приходится останавливаться, чтобы освободить и выделить память. Чтобы обойти эту непредсказуемость, вы можете использовать уровень неуправляемой памяти C#.
Дополнительную информацию о том, как работает управляемая память, см. в документации по управляемой памяти.
Неуправляемая память C#
Уровень неуправляемой памяти C# позволяет получить доступ к уровню собственной памяти для точной настройки распределения памяти с удобством написания кода C#.
Вы можете использовать пространство имен Unity.Collections
(включая NativeArray) в API ядра Unity и структуры данных в пакете Unity Collections для доступа Неуправляемая память С#. Если вы используете систему Unity C# Job или Burst, вы должны использовать неуправляемую память C#. Дополнительную информацию об этом см. в документации по системе заданий и Всплеск.
Родная память
Внутреннее ядро C/C++ движка Unity имеет собственную систему управления памятью, которая называется исходной памятью. В большинстве случаев вы не можете напрямую получить доступ к этому типу памяти или изменить его.
Unity хранит сценыСцена содержит окружение и меню вашей игры. Думайте о каждом уникальном файле сцены как об уникальном уровне. В каждой сцене вы размещаете свое окружение, препятствия и декорации, по сути проектируя и создавая свою игру по частям. Подробнее
См. Словарь в вашем проекте, ресурсах, графических API , графические драйверы, подсистема и подключаемый модульНабор кода, созданный вне Unity, который создает функциональность в Unity. В Unity можно использовать два типа подключаемых модулей: управляемые подключаемые модули (управляемые сборки .NET, созданные с помощью таких инструментов, как Visual Studio) и собственные подключаемые модули (библиотеки собственного кода для конкретной платформы). Подробнее
См. в Словарь и выделениях внутри собственной памяти, что означает, что вы можете косвенно получить доступ к собственной памяти через C# API Unity. Это означает, что вы можете легко и безопасно манипулировать данными своего приложения, не теряя при этом преимуществ нативного и производительного кода, лежащего в основе нативного ядра Unity.
В большинстве случаев вам не нужно взаимодействовать с собственной памятью Unity, но вы можете увидеть, как это влияет на производительность вашего приложения, когда вы используете Profiler с помощью маркеров профилировщикаразмещается в коде для описания события CPU или GPU, которое затем отображается в окне Unity Profiler. Добавляется в код Unity по умолчанию, или вы можете использовать ProfilerMarker API для добавления собственных маркеров. Подробнее
См. в Словарь.