Im Android-System ist der Grenzwert für die Arbeitsspeicherbegrenzung für Memory Limiter (Android 17+) und der Benchmark-Wert für den Arbeitsspeicher-Vitalwert in der Google Play Console „anonymer RSS + Auslagerungsspeicher“. Dieser Wert gibt den tatsächlichen physischen Arbeitsspeicher-Druck an, der vom Prozess belegt wird. Er ist ein wichtiger Messwert, der für einen stabilen App-Betrieb überwacht werden muss.
Derzeit ist es schwierig, die Arbeitsspeichernutzung zu messen, die genau mit „anonymer RSS + Auslagerungsspeicher“ übereinstimmt, entweder zur Laufzeit oder statisch in der Unity Engine.
Auf dieser Seite wird beschrieben, wie Sie den Wert „anonymer RSS + Auslagerungsspeicher“ mit hoher Zuverlässigkeit durch eine Näherung mithilfe des Unity Profiler, der ProfileRecorder API und des Unity Speicher-Profiler in einer Unity Engine Umgebung verfolgen können.
Arbeitsspeichernutzung zur Laufzeit prüfen
In Unity ist es schwierig, die genaue Arbeitsspeichernutzung von „anonymer RSS + Auslagerungsspeicher“ von Android zur Laufzeit ohne zusätzlichen Aufwand zu messen. Sie können diesen Wert jedoch mithilfe der integrierten Profiler-APIs von Unity genau schätzen (mit einer Abweichung von etwa 10 %).
Methode 1: Profiler verwenden
Sie können die Gesamtarbeitsspeichernutzung schätzen, indem Sie die von den folgenden Profiler-APIs zurückgegebenen Werte addieren:
using UnityEngine;
using UnityEngine.Profiling;
public class MemoryMonitor : MonoBehaviour
{
public long GetEstimatedMemoryUsageBytes()
{
long totalReserved = Profiler.GetTotalReservedMemoryLong();
long monoHeapSize = Profiler.GetMonoHeapSizeLong();
return totalReserved + monoHeapSize;
}
}
Methode 2: Klasse ProfilerRecorder verwenden
Mit ProfilerRecorder können Sie die Messwerte Total Reserved Memory und Gfx Reserved Memory verfolgen:
In Entwicklungs-Builds: Berechnen Sie „Total Reserved Memory“ – „Gfx Reserved Memory“.
In Release-Builds: Verwenden Sie direkt „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;
}
}
Einschränkung:
Arbeitsspeicherzuweisungen, die den Memory Manager von Unity umgehen (z.B. NativeMalloc(IntPtr size)), können von diesen APIs nicht verfolgt werden.
Diese APIs werden je nach Unity-Version möglicherweise nicht unterstützt.
Arbeitsspeicheraufschlüsselung analysieren (statische Analyse)
Wenn zur Laufzeit eine hohe Arbeitsspeichernutzung festgestellt wird, müssen Sie ermitteln, wo Arbeitsspeicher verbraucht wird. Durch die Analyse der Arbeitsspeicherverteilung können Sie unnötige Zuweisungen vermeiden und den gesamten Speicherbedarf des Spiels reduzieren.
Unity Memory Profiler
Für eine detaillierte Speicheranalyse und zur Optimierung Ihres Spiels verwenden Sie das Paket Unity Speicher-Profiler. So finden Sie die Elemente, die der Android-Betriebssystem 'anonymer RSS + Auslagerungsspeicher'-Nutzung entsprechen:
- Erstellen Sie mit dem Unity Speicher-Profiler einen Snapshot.
- Öffnen Sie den Snapshot und rufen Sie All of Memory > Resident Memory on Device auf.
Berechnen Sie die Summe der folgenden Elemente:
- Untracked
- Android Runtime
- Nativ
- Verwaltet
Abbildung 1. Speicherbeschreibungen werden im residenten Arbeitsspeicher gespeichert.
Die Gesamtsumme dient als praktischer Ersatz für „anonymer RSS + Auslagerungsspeicher“ des Android-Betriebssystems und liefert umsetzbare Erkenntnisse für die Analyse des Arbeitsspeicherbedarfs des Spiels.
Einschränkung:
Bei starkem Arbeitsspeicher-Druck komprimiert oder lagert das Android-Betriebssystem möglicherweise aktive Arbeitsspeicherseiten aus, um RAM freizugeben. Da der Unity Speicher-Profiler ausgelagerten Arbeitsspeicher nicht verfolgen kann, können bei hoher Arbeitsspeichernutzung Abweichungen auftreten.
Diese Funktionen sind je nach Unity-Version möglicherweise eingeschränkt.
Genauere Bewertung
Verwenden Sie Perfetto, um die genauen Werte für „anonymer RSS + Auslagerungsspeicher“ des Android-Betriebssystems zu ermitteln. Damit können Sie die Arbeitsspeichernutzung auf Systemebene genau messen und den Speicherbedarf Ihres Spiels gründlich analysieren.