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