2012-08-14 13 views
5

Soy bastante nuevo en Android y he estado desarrollando un juego. De vez en cuando tengo usuarios que informan sobre memory exceptions, lo cual me parece sorprendente ya que los mapas de bits que creo tienen como máximo 200 KB de tamaño. Llamo al BitmapFactory.decodeResource() cada vez que creo un nuevo sprite. Como mi aplicación es un juego de defensa zombie, podrías esperar que creara sprites con bastante frecuencia.Android: Excepción de falta de memoria/¿Cómo se agrega decodeResource al presupuesto de VM?

Cada vez que creo un sprite, llamo a un recurso de decodificación para generar un mapa de bits. Mi pregunta es: si tuviera que llamar solo al recurso de decodificación al comienzo de cada actividad y consultar el mapa de bits a nivel de paquete, ¿disminuiría esto la cantidad de memoria colocada en el presupuesto de VM?

Respuesta

18
  • Al decodificar el mapa de bits de un recurso de imagen como PNG, que depende más de las dimensiones de la imagen en lugar de en el tamaño KBs.
  • Intente si puede reducir las dimensiones de la imagen original sin afectar realmente a su salida.
  • Intente reutilizar los mapas de bits en lugar de seguir decodificando.
  • Explore más opciones con el objeto BitmapFactory.Options(), por ejemplo, aumentar inSampleSize puede reducir la cantidad de memoria requerida por la imagen. por ejemplo
     
    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 solución complicado útil si no hay otras optimizaciones realmente están funcionando para usted es que, se puede coger el OutOfMemoryException y luego puede reducir la calidad de máx .. es decir, estableciendo el inSampleSize a 16. Se reducirá el la calidad de sus imágenes, pero al menos salvará su aplicación de fallas, lo hice en una de mis aplicaciones donde necesitaba cargar una gran imagen MP en un mapa de bits.
+1

a partir de documentos de 'inPurgeable': Nota: Esta bandera se ignora cuando se utiliza con' decodeResource (Recursos, int, android.graphics.BitmapFactory.Options) '' o decodeFile (String, android.graphics.BitmapFactory. Opciones) '. –

0

Mi fragmento para ver la imagen desde la seguridad de los recursos. Puede establecer su propio sampleSize como umbral de calidad de imagen (la sampleSize es de menor calidad de imagen).

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; 
    } 
} 
Cuestiones relacionadas