В системе 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 »:
- Сделайте снимок памяти с помощью Unity Memory Profiler.
- Откройте снимок и перейдите в раздел «Вся память» > «Резидентная память на устройстве» .
Вычислите сумму следующих элементов:
- Неотслеживаемый
- Среда выполнения Android
- Родной
- Удалось

Рисунок 1. Описания памяти хранятся в резидентной памяти.
Полученная сумма служит практической заменой анонимному RSS-каналу Android OS "+ swap ", предоставляя полезные аналитические данные для анализа игровой памяти.
Ограничение :
При сильной нагрузке на память ОС Android может сжимать или подкачивать активные страницы памяти, чтобы освободить оперативную память. Поскольку Unity Memory Profiler не может отслеживать подкачку памяти, при интенсивном использовании памяти могут возникать расхождения.
В зависимости от версии Unity эти функции могут быть ограничены.
Более точная оценка
Для точной проверки значений анонимного RSS + swap в операционной системе Android используйте Perfetto . Он позволяет измерить точное использование памяти на системном уровне и тщательно проанализировать объем памяти, занимаемый вашей игрой.