Dopo aver compreso la gestione della memoria di Android e aver configurato gli strumenti per misurare l'utilizzo della memoria del gioco, il passaggio successivo consiste nel ridurlo e ottimizzarlo attivamente. Rispettare i limiti rigorosi di Android aiuta a impedire al sistema di chiudere il gioco, a ridurre i tempi di avvio lunghi e a garantire che il gioco funzioni correttamente su tutti i dispositivi.
Questa guida fornisce tecniche pratiche per ridurre il footprint della memoria del gioco, concentrandosi in particolare sull'ottimizzazione a livello di asset, sulle configurazioni specifiche del motore e sulle best practice per la gestione della memoria.
Ridurre la memoria in Unity
A causa della progettazione architettonica di Unity, una volta che gli allocatori di blocchi nativi e l'heap gestito si espandono, il motore tende a conservare queste pagine di memoria per il riutilizzo anziché restituirle immediatamente al sistema operativo (SO), anche dopo il rilascio degli asset. In particolare, lo spazio di indirizzi virtuali (memoria riservata) rimane riservato per la durata del processo e la memoria fisica (RSS) non viene recuperata immediatamente finché non si verificano diversi cicli di garbage collection (GC) e di riduzione. Di conseguenza, un picco di memoria temporaneo può far sì che la memoria residente rimanga aumentata a lungo anche dopo la riduzione dell'utilizzo effettivo. Questo comportamento aumenta il rischio di arresti anomali per esaurimento della memoria (OOM) sui dispositivi di fascia bassa e riduce la stabilità complessiva del runtime.
Pertanto, l'ottimizzazione della memoria di Unity deve essere affrontata attraverso tre pilastri fondamentali adattati a questi comportamenti del motore:
- Controlla l'utilizzo della memoria attiva per evitare picchi di memoria utilizzata in primo luogo.
- Gestisci i formati delle texture e le varianti degli shader per assicurarti che non vengano create istanze di asset e risorse native non necessari.
- Esegui il refactoring delle strutture del codice di runtime per eliminare le allocazioni non necessarie nell'heap gestito al fine di ridurre al minimo la frequenza di GC e l'espansione dell'heap.
Per saperne di più, consulta Ottimizzazione della memoria di Unity.