Как проверить использование памяти с помощью инструментов Unity

В системе Android пороговое значение ограничения памяти для Memory Limiter (Android 17+) и эталонное значение параметра memory vital в Google Play Console равно ' anonymous RSS + swap '. Это значение отражает уровень физической нагрузки на память, фактически занимаемую процессом, и является критически важным показателем, который необходимо отслеживать для стабильной работы приложения.

В настоящее время сложно точно измерить использование памяти, соответствующее "анонимному RSS + файлу подкачки", как во время выполнения, так и статически в рамках Unity Engine.

Для решения этой проблемы на данной странице представлен способ высоконадежного отслеживания значения « анонимный RSS + swap » с помощью аппроксимации, используя Unity Profiler, API ProfileRecorder и Unity Memory Profiler в среде Unity Engine.

Проверка использования памяти во время выполнения

В Unity прямое измерение точного объема памяти, используемой Android в режиме « анонимный RSS + файл подкачки », без дополнительных затрат может быть сложной задачей. Однако вы можете приблизительно оценить это значение (с погрешностью около 10%), используя встроенные API профилировщика Unity.

Метод 1: Использование профилировщика

Общий объем используемой памяти можно оценить, суммировав значения, возвращаемые следующими API-интерфейсами профилировщика:

using UnityEngine;
using UnityEngine.Profiling;

public class MemoryMonitor : MonoBehaviour
{
    public long GetEstimatedMemoryUsageBytes()
    {
        long totalReserved = Profiler.GetTotalReservedMemoryLong();
        long monoHeapSize = Profiler.GetMonoHeapSizeLong();

        return totalReserved + monoHeapSize;
    }
}

Метод 2: Использование класса ProfilerRecorder

С помощью ProfilerRecorder можно отслеживать показатели Total Reserved Memory (Общий объем зарезервированной памяти) и Gfx Reserved Memory (Зарезервированная память для графики) :

  • В сборках для разработки: вычислите ' Общий объем зарезервированной памяти ' - ' Зарезервированная память для графики '.

  • В релизных сборках: используйте параметр ' Total Reserved Memory ' напрямую.

using Unity.Profiling;
using UnityEngine;

public class MemoryMonitor : MonoBehaviour
{
    ProfilerRecorder totalRecorder;

#if DEVELOPMENT_BUILD
    ProfilerRecorder gfxRecorder;
#endif

    private void OnEnable()
    {
        totalRecorder = ProfilerRecorder.StartNew(ProfilerCategory.Memory, "Total Reserved Memory");

#if DEVELOPMENT_BUILD
        gfxRecorder = ProfilerRecorder.StartNew(ProfilerCategory.Memory, "Gfx Reserved Memory");
#endif
    }

    private void OnDisable()
    {
        totalRecorder.Dispose();

#if DEVELOPMENT_BUILD
        gfxRecorder.Dispose();
#endif
    }

    public long GetEstimatedMemoryUsageBytes()
    {
#if DEVELOPMENT_BUILD
        if (totalRecorder.Valid && gfxRecorder.Valid)
        {
            return totalRecorder.LastValue - gfxRecorder.LastValue;
        }
#else
        if (totalRecorder.Valid)
        {
            return totalRecorder.LastValue;
        }
#endif
        return 0;
    }
}

Ограничение :

  • Выделение памяти в обход менеджера памяти Unity (например, NativeMalloc(IntPtr size)) не может отслеживаться этими API.

  • Поддержка этих API может зависеть от вашей версии Unity.

Анализ сбоев в работе памяти (статический анализ)

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

Профайлер памяти Unity

Для проведения углубленного анализа памяти и оптимизации игры используйте пакет Unity Memory Profiler . Чтобы найти элементы, соответствующие использованию Android OS « anonymous RSS + swap »:

  1. Сделайте снимок памяти с помощью Unity Memory Profiler.
  2. Откройте снимок и перейдите в раздел «Вся память» > «Резидентная память на устройстве» .
  3. Вычислите сумму следующих элементов:

    • Неотслеживаемый
    • Среда выполнения Android
    • Родной
    • Удалось
    Показатели использования памяти отображаются при выборе параметра «Резидентная память» в Unity Memory Profiler.
    Рисунок 1. Описания памяти хранятся в резидентной памяти.

Полученная сумма служит практической заменой анонимному RSS-каналу Android OS "+ swap ", предоставляя полезные аналитические данные для анализа игровой памяти.

Ограничение :

  • При сильной нагрузке на память ОС Android может сжимать или подкачивать активные страницы памяти, чтобы освободить оперативную память. Поскольку Unity Memory Profiler не может отслеживать подкачку памяти, при интенсивном использовании памяти могут возникать расхождения.

  • В зависимости от версии Unity эти функции могут быть ограничены.

Более точная оценка

Для точной проверки значений анонимного RSS + swap в операционной системе Android используйте Perfetto . Он позволяет измерить точное использование памяти на системном уровне и тщательно проанализировать объем памяти, занимаемый вашей игрой.