2013-03-17 11 views
11

Sto scrivendo un gioco arcade in tempo reale per Android> = 2.1. Durante il gameplay non sto allocando memoria, per non sedurre GC. Beacuse se invoca GC, richiede un processore per 70-200ms. L'utente lo vede come "oh no, quel gioco è in ritardo ...".Altri processi chiamano GC che rallenta il mio gioco

Ho controllato LogCat. Ci sono molti GC_FOR_MALLOC o GC_EXPLICIT. Ma ... non dalla PID del mio processo! Il mio gioco non li sta causando. Sono causati perché altri processi, in esecuzione in background. Alcuni sfondi, widget, radio, email, controllo del tempo e altri servizi ...

Non lo capisco del tutto. Quando, per esempio, la carta da parati scompare, viene chiamato onPause(), suppongo. Quindi, dovrebbe interrompere tutti i suoi thread e certamente non allocare alcuna memoria (o chiamare System.gc()). Forse è stato implementato erroneamente? Non lo so. Ma ci sono alcuni servizi Android, che causano anche GC di tanto in tanto ... È strano.

È un grande Android < = 2,2 difetti di architettura? Android 2.3 introduces GC simultaneo, che richiede meno tempo.

Cosa posso fare per assicurarmi che il mio gioco funzioni senza intoppi?

risposta

2

Prima di tutto, le cose che vedete in LogCat saranno diverse da un dispositivo all'altro. Se sei certo che il GC non proviene dalla tua app, non hai assolutamente nulla che tu possa fare. Troverete sempre che il GC sta facendo ... qualcosa. Assicurati di mantenere il tuo codice pulito e molto lite.

Inoltre, ricorda che in generale, in presenza di un garbage collector, non è mai una buona pratica chiamare manualmente il GC. Un GC è organizzato attorno ad algoritmi euristici che funzionano meglio se lasciati ai propri dispositivi. La chiamata manuale del GC spesso riduce le prestazioni.

Occasionalmente, in alcune situazioni relativamente rare, è possibile che uno specifico GC non funzioni correttamente e una chiamata manuale al GC può quindi migliorare le prestazioni, in termini di prestazioni. Questo perché non è davvero possibile implementare un GC "perfetto" che gestirà la memoria in modo ottimale in tutti i casi. Tali situazioni sono difficili da prevedere e dipendono da molti dettagli di implementazione sottili. La "buona pratica" è quella di far funzionare il GC da solo; l'eccezione è una chiamata manuale al GC, che dovrebbe essere prevista solo dopo aver debitamente verificato un problema di prestazioni effettivo.

Non credo sia un difetto su Android < = 2.2. Accade sulle versioni più alte? L'hai provato?

+0

Perché non ci credi? Sì, l'ho testato su 2.2 e 4.1. Il comportamento su 2.2 è come ho descritto. Alla 4.1, come ho detto, c'è un GC concorrente, che rende questo problema meno grave. –

Problemi correlati