Arbeitsspeicher in Spielen effektiv verwalten

Auf der Android-Plattform versucht das System, so viel Arbeitsspeicher (RAM) wie möglich und führt verschiedene Optimierungen des Arbeitsspeichers durch, um bei Bedarf Speicherplatz freizugeben. Diese Optimierungen können sich negativ auf Ihr Spiel auswirken, indem sie oder gänzlich lahmlegen. Weitere Informationen zu diesen Optimierungen im Thema Arbeitsspeicherzuweisung zwischen Prozessen.

Auf dieser Seite wird erläutert, wie Sie Bedingungen mit niedrigem Arbeitsspeicher vermeiden können. die Ihr Spiel beeinflussen.

Auf onTrimMemory() reagieren

Das System verwendet onTrimMemory() um Ihre App über Lebenszyklus-Ereignisse zu informieren, die für Ihr Unternehmen die Arbeitsspeichernutzung freiwillig reduziert und verhindert, dass sie vom Low-Memory-Killer (LMK) um Speicher für andere Apps freizugeben.

Wenn Ihre App im Hintergrund beendet wird, startet der Nutzer das nächste Mal, wenn er sie startet. Ihrer App wird er nur langsam Kaltstart. Apps, die ihre dass die Arbeitsspeichernutzung beim Ausführen in den Hintergrund mit geringerer Wahrscheinlichkeit Hintergrund.

Beim Reagieren auf Trim-Ereignisse sollten große Arbeitsspeicherzuweisungen freigegeben werden. die nicht sofort benötigt werden und bei Bedarf rekonstruiert werden können. Für Beispiel: Ihre App verfügt über einen Cache mit Bitmaps, die aus lokal decodierten komprimierte Bilder gespeichert, empfiehlt es sich oft, diese zuzuschneiden oder Cache als Antwort auf TRIM_MEMORY_UI_HIDDEN

Kotlin

class MainActivity : AppCompatActivity(), ComponentCallbacks2 {
    override fun onTrimMemory(level: Int) {
        if (level >= ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN) {
            // Release memory related to UI elements, such as bitmap caches.
        }
        if (level >= ComponentCallbacks2.TRIM_MEMORY_BACKGROUND) {
            // Release memory related to background processing, such as by
            // closing a database connection.
        }
    }
}

Java

public class MainActivity extends AppCompatActivity implements ComponentCallbacks2 {
    public void onTrimMemory(int level) {
        switch (level) {
            if (level >= ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN) {
                // Release memory related to UI elements, such as bitmap caches.
            }
            if (level >= ComponentCallbacks2.TRIM_MEMORY_BACKGROUND) {
                // Release memory related to background processing, such as by
                // closing a database connection.
            }
        }
    }
}

C#

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

class LowMemoryTrigger : MonoBehaviour
{
    private void Start()
    {
        Application.lowMemory += OnLowMemory;
    }
    private void OnLowMemory()
    {
        // Respond to low memory condition (e.g., Resources.UnloadUnusedAssets())
    }
}

Memory Advice API (Beta) verwenden

Die Memory Advice API wurde entwickelt als ist eine Alternative zu onTrimMemory, die eine viel höhere Trefferquote und Vorhersagen von bevorstehenden LMKs. Dazu schätzt die API die Menge der verwendeten Arbeitsspeicherressourcen und benachrichtigt die App, wenn bestimmte Grenzwerte überschritten werden. Die API kann auch den geschätzten Prozentsatz Arbeitsspeichernutzung direkt in Ihrer App. Sie können die Memory Advice API als Alternative zu onTrimMemory Ereignisse zum Zweck der Speicherverwaltung.

Verwenden Sie zur Verwendung der Memory Advice API die Startleitfaden.

Mit Speicherbudgets vorsichtig umgehen

Legen Sie das Budget des Arbeitsspeichers vorsichtig fest, um nicht über ausreichend Arbeitsspeicher zu verfügen. Einige Elemente für sollten Sie Folgendes berücksichtigen:

  • Größe des physischen RAM: Spiele nutzen häufig zwischen 1⁄4 und 1⁄2 des physischen Arbeitsspeichers RAM-Speicherplatz auf dem Gerät
  • Maximale zRAM-Größe: Je größer der ZRAM, desto mehr Arbeitsspeicher hat das Spiel. zuzuweisen. Dieser Betrag kann je nach Gerät variieren. nach SwapTotal suchen in /proc/meminfo, um diesen Wert zu ermitteln.
  • Arbeitsspeichernutzung des Betriebssystems: Geräte, die dem System mehr RAM zuweisen und Prozesse haben weniger Arbeitsspeicher für das Spiel. Das System beendet die bevor sie Systemprozesse beendet.
  • Arbeitsspeichernutzung installierter Apps: Testen Sie Ihr Spiel auf Geräten mit vielen Apps installiert. Soziale Medien und Chat-Apps müssen ständig verfügbar sein und die Menge an kostenlosem Arbeitsspeicher.

Wenn Sie sich nicht auf ein konservatives Arbeitsspeicherbudget festlegen können, sollten Sie einen flexibleren Ansatz wählen. Reduzieren Sie den Arbeitsspeicher bei unzureichendem Arbeitsspeicher die im Spiel genutzt werden. Weisen Sie beispielsweise Texturen mit geringerer Auflösung zu oder speichern Sie weniger Shader als Reaktion auf onTrimMemory(). Dieser dynamische Ansatz für das Gedächtnis die Zuweisung erfordert mehr Arbeit vom Entwickler, insbesondere im .

Seitenflattern vermeiden

Ein Stahl tritt auf, wenn nur wenig kostenloser Speicher vorhanden ist, aber nicht genug, um das Spiel zu beenden. In diesem Fall hat kswapd Seiten freigegeben, die das Spiel noch benötigt, versucht, die Seiten aus dem Speicher zu aktualisieren. Es ist nicht genügend Platz vorhanden, sodass die Seiten ständig ausgetauscht werden (kontinuierlicher Austausch). Bei der Systemverfolgung wird diese Situation als Thread gemeldet. wobei kswapd kontinuierlich ausgeführt wird.

Ein Symptom ist lange Frame Time, möglicherweise eine Sekunde oder mehr. Reduzieren den Speicher-Fußabdruck des Spiels aus, um das Problem zu lösen.

Verfügbare Tools verwenden

Android bietet eine Reihe von Tools, die helfen sollen, zu verstehen, den Arbeitsspeicher verwaltet.

Erinnerung

Dieses Tool erfasst Speicherstatistiken, die zeigen, wie viel Speicher PSS-Speicher und die Kategorien, für die sie verwendet wurden.

Drucken Sie die meminfo-Statistiken in einer der auf folgende Arten:

  • Führen Sie den Befehl adb shell dumpsys meminfo package-name aus.
  • MemoryInfo-Aufruf verwenden aus der Android Debug API.

Die Statistik PrivateDirty zeigt die RAM-Speicher innerhalb des Prozesses, der nicht per Paging auf das Laufwerk übertragen werden kann und nicht gemeinsam genutzt wird mit anderen Prozessen. Der Großteil dieses Betrags steht wenn dieser Prozess beendet wird.

Arbeitsspeicher-Trace-Punkte

Speicher-Trace-Punkte verfolgen die RSS-Speicher die Ihr Spiel nutzt. Die Berechnung der RSS-Arbeitsspeichernutzung geht viel schneller als die Berechnung PSS-Nutzung Da RSS sich schneller berechnen lässt, zeigt RSS auf Änderungen der Arbeitsspeichergröße, um genauere Messungen der maximalen Arbeitsspeichernutzung zu ermöglichen. Daher ist es leichter, Spitzen zu erkennen, die dazu führen könnten, zu speichern.

Perfetto und lange Traces

Perfetto ist eine Suite von Tools zum Erfassen von Leistungs- und Speicherinformationen auf einem Gerät und zum Darstellen in einer webbasierten Benutzeroberfläche. Sie unterstützt beliebig lange Traces, sodass Sie verfolgen können, wie sich RSS im Laufe der Zeit ändert. Sie können auch SQL-Abfragen für die Daten ausführen, die für die Offlineverarbeitung erzeugt werden. Aktivieren Sie lange Traces aus der System Tracing App Achten Sie darauf, dass die Die Kategorie memory:Memory ist für den Trace aktiviert.

Heapprofd

heapprofd ist ein Speicher-Tracking-Tool, das zu Perfetto gehört. Mit diesem Tool können Sie Speicherlecks finden, wobei Speicher mit malloc zugewiesen wurde. heapprofd kann gestartet werden mit einem Python-Skript und da das Tool wenig Aufwand hat, hat es keine Auswirkungen wie andere Tools wie Malloc Debug.

Fehlerbericht

bugreport ist ein Protokollierungstool, mit dem du herausfinden kannst, ob dein Spiel abgestürzt ist oder nicht weil mir der Arbeitsspeicher ausging. Die Ausgabe des Tools ist viel detaillierter als bei Verwendung von Logcat. Sie ist nützlich für die Speicherfehlerbehebung, da sie angibt, ob Ihr Spiel abgestürzt ist, weil der Arbeitsspeicher aufgebraucht war, oder ob es vom LMK beendet wurde.

Weitere Informationen finden Sie unter Fehlerberichte erstellen und lesen