Dans le système Android, le seuil de limite de mémoire pour le limiteur de mémoire (Android 17+) et la valeur de référence pour la métrique de mémoire vitale dans la Google Play Console sont 'RSS anonyme + espace d'échange'. Cette valeur représente le niveau de pression de la mémoire physique réellement occupé par le processus. Il s'agit d'une métrique essentielle qui doit être surveillée pour assurer le fonctionnement stable de l'application.
Actuellement, il est difficile de mesurer l'utilisation de la mémoire qui correspond exactement à "RSS anonyme + espace d'échange", que ce soit au moment de l'exécution ou de manière statique dans le moteur Unity.
Pour résoudre ce problème, cette page explique comment suivre la valeur 'RSS anonyme + espace d'échange' avec une grande fiabilité grâce à une approximation à l'aide de Unity Profiler, de l'API ProfileRecorder et de Unity Memory Profiler dans un environnement de moteur Unity.
Vérifier l'utilisation de la mémoire au moment de l'exécution
Dans Unity, il peut être difficile de mesurer directement l'utilisation exacte de la mémoire "RSS anonyme + espace d'échange" d'Android au moment de l'exécution sans surcharge. Toutefois, vous pouvez estimer cette valeur de manière précise (avec une variance d'environ 10 %) à l'aide des API Profiler intégrées d'Unity.
Méthode 1 : Utiliser le Profiler
Vous pouvez estimer l'utilisation totale de la mémoire en additionnant les valeurs renvoyées par les API Profiler suivantes :
using UnityEngine;
using UnityEngine.Profiling;
public class MemoryMonitor : MonoBehaviour
{
public long GetEstimatedMemoryUsageBytes()
{
long totalReserved = Profiler.GetTotalReservedMemoryLong();
long monoHeapSize = Profiler.GetMonoHeapSizeLong();
return totalReserved + monoHeapSize;
}
}
Méthode 2 : Utiliser la classe ProfilerRecorder
Vous pouvez suivre les métriques Total Reserved Memory (Mémoire réservée totale) et Gfx Reserved Memory (Mémoire réservée Gfx) à l'aide de ProfilerRecorder :
Dans les builds de développement : calculez 'Total Reserved Memory' - 'Gfx Reserved Memory'.
Dans les builds de version : utilisez directement '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;
}
}
Limitation:
Les allocations de mémoire qui contournent le gestionnaire de mémoire d'Unity (par exemple, NativeMalloc(IntPtr size)) ne peuvent pas être suivies par ces API.
Ces API ne sont peut-être pas compatibles selon votre version d'Unity.
Analyser la répartition de la mémoire (analyse statique)
Si une utilisation élevée de la mémoire est détectée au moment de l'exécution, vous devez identifier où la mémoire est consommée. L'analyse de la répartition de la mémoire vous permet d'éliminer les allocations inutiles et de réduire l'empreinte mémoire globale du jeu.
Unity Memory Profiler
Pour effectuer une analyse approfondie de la mémoire et optimiser votre jeu, utilisez le package Profileur de mémoire Unity. Pour localiser les éléments correspondant à l'utilisation de 'RSS anonyme + espace d'échange' d'OS Android :
- Capturez un instantané à l'aide de Unity Memory Profiler.
- Ouvrez l'instantané et accédez à All of Memory > Resident Memory on Device (Toute la mémoire > Mémoire résidente sur l'appareil).
Calculez la somme des éléments suivants :
- Untracked
- Android Runtime
- Natif
- Géré
Figure 1. Les descriptions de la mémoire sont stockées dans la mémoire résidente.
La somme totale sert de substitut pratique à "RSS anonyme + espace d'échange" de l'OS Android, et fournit des insights exploitables pour l'analyse de la mémoire du jeu.
Limitation:
En cas de forte pression sur la mémoire, l'OS Android peut compresser ou échanger des pages de mémoire actives pour libérer de la RAM. Étant donné que Unity Memory Profiler ne peut pas suivre la mémoire échangée, des écarts peuvent survenir en cas d'utilisation élevée de la mémoire.
Ces fonctionnalités peuvent être limitées selon votre version d'Unity.
Évaluation plus précise
Pour vérifier les valeurs exactes de 'RSS anonyme + espace d'échange' d'OS Android, utilisez Perfetto. Il vous permet de mesurer l'utilisation précise de la mémoire au niveau du système et d'analyser en détail l'empreinte mémoire de votre jeu.