2012-08-14 14 views
5

Sono abbastanza nuovo per Android e ho sviluppato un gioco. Ogni tanto ho utenti che segnalano da memory exceptions, che trovo sorprendente dal momento che i bitmap che creo sono al massimo di 200 kb. Chiamo BitmapFactory.decodeResource() ogni volta che creo un nuovo sprite. Dato che la mia applicazione è un gioco di difesa degli zombi, potresti aspettarti di creare degli sprite abbastanza spesso.Android: Eccezione memoria esaurita/In che modo decodeResource viene aggiunto al budget della macchina virtuale?

Ogni volta che creo uno sprite, chiamo la risorsa di decodifica per generare una bitmap. La mia domanda è se dovessi chiamare la risorsa di decodifica solo all'inizio di ogni attività e fare riferimento alla bitmap a livello di pacchetto, questo ridurrebbe la quantità di memoria inserita nel budget della VM?

risposta

18
  • Quando si decodificare il bitmap da una risorsa immagine come png, è dipende più dalle dimensioni dell'immagine piuttosto che la dimensione in KB.
  • Provare a ridurre le dimensioni dell'immagine originale senza influire in modo significativo sull'output.
  • Provare a riutilizzare le bitmap anziché continuare a decodificarle.
  • Esplora altre opzioni con l'oggetto BitmapFactory.Options(), ad esempio l'aumento di inSampleSize può ridurre la quantità di memoria richiesta dall'immagine. esempio
     
    BitmapFactory.Options o=new BitmapFactory.Options(); 
    o.inSampleSize = 4; 
    o.inDither=false;      //Disable Dithering mode 
    o.inPurgeable=true;     //Tell to gc that whether it needs free memory, the Bitmap can be cleared 
    myBitMap=BitmapFactory.decodeResource(getResources(),ID, o); 
    
  • Una soluzione difficile utile se non altre ottimizzazioni stanno davvero lavorando per voi è che, si può prendere l'OutOfMemoryException e quindi in grado di ridurre la qualità al massimo .. cioè l'impostazione del inSampleSize a 16. Esso contribuirà a ridurre la la qualità delle tue immagini, ma almeno salverà la tua applicazione da crash, l'ho fatto in una delle mie app in cui avevo bisogno di caricare enormi immagini MP in una bitmap.
+1

Da documenti di 'inPurgeable': Nota: Questo flag viene ignorato quando viene utilizzato con' decodeResource (Risorse, int, android.graphics.BitmapFactory.Options) 'o' decodeFile (String, android.graphics.BitmapFactory. opzioni) '. –

0

Il mio snippet per ottenere l'immagine dalla sicurezza delle risorse. È possibile impostare il proprio valore sampleSize come soglia della qualità dell'immagine (maggiore sampleSize è una qualità dell'immagine inferiore).

public static Bitmap loadBitmapSafety(int resDrId, Context context){ 
    return loadBitmapSafety(resDrId, 1, context); 
} 

private static Bitmap loadBitmapSafety(int resDrId, int sampleSize, Context context){ 
    BitmapFactory.Options ops = new BitmapFactory.Options(); 
    ops.inSampleSize = sampleSize; 

    try { 
     return BitmapFactory.decodeResource(context.getResources(), resDrId, ops); 

    } catch (OutOfMemoryError e) { 
     if (sampleSize == 4) 
      return null; 
     return loadBitmapSafety(resDrId, sampleSize +1, context); 

    } catch (Exception e){ 
     return null; 
    } 
} 
Problemi correlati