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 ist 'anonyme RSS + Auslagerung'. Dieser Wert gibt den physischen Arbeitsspeicher-Druck an, der tatsächlich 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 „anonyme RSS + Auslagerung“ übereinstimmt, entweder zur Laufzeit oder statisch in der Unity Engine.

Auf dieser Seite wird beschrieben, wie Sie den Wert „anonyme RSS + Auslagerung“ mit hoher Zuverlässigkeit durch 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 kann es schwierig sein, die genaue Arbeitsspeichernutzung von Android für anonyme RSS + Auslagerung zur Laufzeit ohne Mehraufwand zu messen. Sie können diesen Wert jedoch mit den 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 Werte addieren, die von den folgenden Profiler-APIs zurückgegeben werden:

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 MemoryGfx 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

Verwenden Sie das Paket Unity Memory Profiler, um eine detaillierte Arbeitsspeicheranalyse durchzuführen und Ihr Spiel zu optimieren. So finden Sie die Elemente, die der Android-Betriebssystem 'anonyme RSS + Auslagerung'-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. Arbeitsspeicherbeschreibungen werden im residenten Arbeitsspeicher gespeichert.

Die Gesamtsumme dient als praktischer Ersatz für anonyme RSS + Auslagerung des Android-Betriebssystems und liefert umsetzbare Erkenntnisse für die Arbeitsspeicheranalyse von Spielen.

Einschränkung:

  • Bei hohem 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 'anonyme RSS + Auslagerung' des Android-Betriebssystems zu überprüfen. Damit können Sie die Arbeitsspeichernutzung auf Systemebene genau messen und den Speicherbedarf Ihres Spiels gründlich analysieren.