Sulla piattaforma Android, il sistema tenta di utilizzare la quantità di memoria di sistema (RAM) necessaria possibile ed esegue varie ottimizzazioni della memoria per liberare spazio quando necessario. Queste ottimizzazioni possono avere un effetto negativo sul gioco, sia rallentando lo butta giù o lo uccide del tutto. Puoi scoprire di più su queste ottimizzazioni sull'argomento Allocazione della memoria tra i processi.
In questa pagina vengono illustrati i passaggi da seguire per evitare condizioni di memoria insufficiente che interessano il tuo gioco.
Rispondere a onTrimMemory()
Il sistema utilizza
onTrimMemory()
per informare la tua app degli eventi del ciclo di vita che rappresentano una buona opportunità per il tuo
per ridurre volontariamente l'utilizzo di memoria ed evitare l'interruzione del servizio
uccisione a bassa memoria (LMK)
per liberare memoria da usare per altre app.
Se l'app si interrompe in background, la volta successiva che l'utente si avvia la tua app subirà una lentezza avvio a freddo. Le app che riducono il loro utilizzo di memoria quando passano in background hanno meno probabilità di essere interrotte in background.
Quando si risponde agli eventi di taglio, è preferibile rilasciare allocazioni di memoria elevate
che non sono immediatamente necessari e
possono essere ricostruiti on demand. Per
Ad esempio, se l'app ha una cache di bitmap decodificati localmente
immagini compresse archiviate, spesso è una buona idea tagliare o eliminare definitivamente
Cache in risposta a
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()) } }
Usa la versione beta dell'API Memory Advice
L'API Memory Advice è stata sviluppata come
un'alternativa a onTrimMemory che ha un richiamo e una precisione molto più elevati
che prevede LMK imminenti. L'API ottiene questo risultato stimando la quantità di risorse di memoria in uso e poi inviando una notifica all'app quando vengono superate determinate soglie. L'API può anche segnalare la percentuale stimata di
memoria utilizzata direttamente nell'app. Puoi usare l'API Memory Advice come
alternativa a
onTrimMemory
per la gestione della memoria.
Per utilizzare l'API Memory Advice, consulta la guida introduttiva.
Adotta un approccio conservativo con i budget per la memoria
Adotta un budget prudente per la memoria per evitare di esaurire la memoria. Alcuni elementi a considera di includere quanto segue:
- Dimensione della RAM fisica: i giochi utilizzano spesso da 1⁄4 a 1⁄2 della RAM fisica Quantità di RAM sul dispositivo.
- Dimensione massima zRAM: più zRAM significa che il gioco potrebbe avere più memoria
da allocare. Questo importo può variare in base al dispositivo. Per trovarlo, cerca
SwapTotal
in/proc/meminfo
. - Utilizzo della memoria del sistema operativo: dispositivi che utilizzano più RAM per il sistema lasciano meno memoria per il tuo gioco. Il sistema termina prima che termini i processi di sistema.
- Utilizzo della memoria delle app installate: testa il gioco sui dispositivi che hanno molte di Google Cloud. Le app di social media e di chat devono essere costantemente eseguite e incidono la quantità di memoria libera.
Se non puoi impegnarti a un budget conservativo per la memoria, prendi in considerazione
l'importanza di un approccio umile. Se nel sistema si verificano problemi di memoria insufficiente, riduci la quantità di memoria.
usata dal gioco. Ad esempio, alloca texture o archivia
Shader in meno in risposta all'evento onTrimMemory()
. Questo approccio dinamico alla memoria
richiede un maggiore impegno da parte dello sviluppatore, soprattutto nella progettazione del gioco
durante la fase di sviluppo.
Evita il thrashing
Il thrashing si verifica quando la memoria libera è scarsa, ma non abbastanza da poter terminare il gioco.
In questa situazione, kswapd
ha recuperato pagine di cui il gioco ha ancora bisogno, quindi versucht di ricaricarle dalla memoria. Lo spazio non è sufficiente, pertanto le pagine
continuano a essere scambiati (scambio continuo).
Il tracciamento del sistema segnala questa situazione come thread
in cui kswapd
viene eseguito continuamente.
Un sintomo del thrashing è la durata dell'inquadratura, ad esempio un secondo o più. Riduci l'impronta di memoria del gioco per risolvere la situazione.
Utilizzare gli strumenti disponibili
Android offre una raccolta di strumenti per aiutare a comprendere in che modo il sistema gestisce la memoria.
Meminfo
Questo strumento raccoglie le statistiche relative alla memoria per mostrare Memoria PSS è stato assegnato e le categorie per cui è stato utilizzato.
Stampa le statistiche meminfo in una delle nei seguenti modi:
- Utilizza il comando
adb shell dumpsys meminfo package-name
. - Utilizza la chiamata
MemoryInfo
dell'API Android Debug.
La statistica PrivateDirty
mostra
quantità di RAM all'interno del processo che non può essere impaginata su disco e non viene condivisa
con qualsiasi altro processo. La maggior parte di questo importo diventa disponibile per
quando il processo viene interrotto.
Punto di traccia della memoria
I tracepoint della memoria monitorano la quantità di memoria RSS utilizzata dal gioco. Il calcolo dell'utilizzo della memoria RSS è molto più veloce rispetto al calcolo Utilizzo PSS. Poiché è più veloce da calcolare, il feed RSS mostra una granularità maggiore variazioni delle dimensioni della memoria per misurazioni più precise dei picchi di utilizzo della memoria. Pertanto, è più facile notare picchi che potrebbero causare l'esaurimento dello la memoria.
Perfetto e tracce lunghe
Perfetto è una suite di strumenti per la raccolta informazioni su prestazioni e memoria su un dispositivo e visualizzate in un'interfaccia utente basata sul web. Supporta tracce arbitrariamente lunghe, in modo da poter visualizzare come cambia il feed RSS nel tempo. Puoi anche eseguire query SQL sui dati che produce per l'elaborazione offline. Abilita tracce lunghe dal App di tracciamento del sistema. Assicurati che La categoria memory:Memory è abilitata per la traccia.
prof.heap
heapprofd
è uno strumento di monitoraggio della memoria
che fa parte di Perfetto. Questo strumento può aiutarti a trovare le fughe di memoria mostrandoti
in cui è stata allocata la memoria utilizzando malloc
. heapprofd
può essere avviato utilizzando uno script Python e, poiché lo strumento ha un overhead ridotto, non influisce sulle prestazioni come altri strumenti come Malloc Debug.
segnalazione di bug
bugreport
è uno strumento di logging che consente di sapere se il gioco si è arrestato in modo anomalo
perché ha esaurito la memoria. L'output dello strumento è molto più dettagliato rispetto all'utilizzo
logcat. È utile per il debug della memoria perché mostra se il gioco ha subito un arresto anomalo.
perché ha esaurito la memoria o se è stato ucciso dall'LMK.
Per ulteriori informazioni, vedi Acquisisci e leggi le segnalazioni di bug.