Arbeitsspeichernutzung mit Unity-Tools prüfen

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:

  1. Erstellen Sie mit dem Unity Speicher-Profiler einen Snapshot.
  2. Öffnen Sie den Snapshot und rufen Sie All of Memory > Resident Memory on Device auf.
  3. Berechnen Sie die Summe der folgenden Elemente:

    • Untracked
    • Android Runtime
    • Nativ
    • Verwaltet
    Speicher-Messwerte, die angezeigt werden, wenn im Unity Speicher-Profiler „Resident Memory“ ausgewählt ist
    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.

Perfetto-Benutzeroberfläche mit anonymer RSS-, Swap- und Summenabfrage.
Abbildung 2. Die Perfetto-Benutzeroberfläche mit der Abfrage für anonymen RSS, Auslagerungsspeicher und deren Summe.