Arbeitsspeicher in Spielen effektiv verwalten

Auf der Android-Plattform versucht das System, so viel Arbeitsspeicher (RAM) wie möglich und führt verschiedene Arbeitsspeicheroptimierungen durch, um bei Bedarf Speicherplatz freizugeben. Diese Optimierungen können sich negativ auf Ihr Spiel auswirken, indem sie oder gänzlich kaputtgehen. 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 zu benachrichtigen, dass der Arbeitsspeicher knapp wird und die App möglicherweise beendet wird. Viele ist das die einzige Warnung, die deine App erhält. Dieser Callback hat eine hohe Latenz relativ zum low-memory Killer (LMK), Daher ist es wichtig, schnell auf den Rückruf zu reagieren.

Reduzieren Sie als Reaktion auf diesen Callback die Geschwindigkeit, Anzahl und Größe der Zuweisungen. onTrimMemory() übergibt eine Konstante, die den Schweregrad angibt. Sie sollten jedoch auf die erste Warnung reagieren, da eine schnellere Zuordnung möglich ist onTrimMemory() kann darauf reagieren.

Kotlin

class MainActivity : AppCompatActivity(), ComponentCallbacks2 {
    override fun onTrimMemory(level: Int) {
        when (level) {
            ComponentCallbacks2.TRIM_MEMORY_MODERATE,
                ComponentCallbacks2.TRIM_MEMORY_RUNNING_LOW,
                ComponentCallbacks2.TRIM_MEMORY_RUNNING_CRITICAL -> // Respond to low memory condition
            else -> Unit
        }
    }
}

Java

public class MainActivity extends AppCompatActivity implements ComponentCallbacks2 {
    public void onTrimMemory(int level) {
        switch (level) {
            case ComponentCallbacks2.TRIM_MEMORY_RUNNING_MODERATE:
              // Respond to low memory condition
                break;
            case ComponentCallbacks2.TRIM_MEMORY_RUNNING_LOW:
              // Respond to low memory condition
                break;
            case ComponentCallbacks2.TRIM_MEMORY_RUNNING_CRITICAL:
              // Respond to low memory condition
                break;
            default:
                break;

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 an die genutzten Arbeitsspeicherressourcen. Außerdem wird die App benachrichtigt, 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 den Startleitfaden.

Mit Speicherbudgets vorsichtig umgehen

Legen Sie das Budget des Arbeitsspeichers vorsichtig fest, um nicht zu viel Arbeitsspeicher zu verbrauchen. 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 zu einem niedrigen Speicherbudget verpflichten können, nehmen Sie eine flexiblere Ansatz. Reduzieren Sie den Arbeitsspeicher bei unzureichendem Arbeitsspeicher das im Spiel genutzt wird. 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 .

Prügeln 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, mit denen Sie Leistungs- und Speicherinformationen auf einem Gerät und werden in einer webbasierten Benutzeroberfläche angezeigt. 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 gehört zu Perfetto. 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. Das ist hilfreich beim Debuggen des Arbeitsspeichers, da es anzeigt, wenn dein Spiel abgestürzt ist. weil es zu wenig Arbeitsspeicher hatte oder vom LMK getötet wurde.

Weitere Informationen finden Sie unter Fehlerberichte erstellen und lesen