Android: Excepción de memoria extra / ¿Cómo se agrega decodeResource al presupuesto de VM?

Soy bastante nuevo en Android y he estado desarrollando un juego. De vez en cuando tengo usuarios que informan de memory exceptions de memory exceptions , lo que me parece sorprendente, ya que los mapas de bits que creo son como máximo 200 kb de tamaño. Llamo BitmapFactory.decodeResource() siempre que crea un nuevo sprite . Desde mi aplicación es un juego de defensa zombie, se podría esperar que crear sprites con bastante frecuencia.

Cada vez que crear un sprite, llamo a decodificar recurso para generar un mapa de bits. Mi pregunta es si yo estaba a sólo llamar descodificar recursos al inicio de cada actividad, y hacer referencia al mapa de bits en el nivel de paquete, esto disminuiría la cantidad de memoria colocada en el presupuesto de VM?

  • Cuando decodifica el mapa de bits de un recurso de imagen como png, depende más de las dimensiones de la imagen que el tamaño en KB.
  • Intente si puede reducir las dimensiones de la imagen original sin afectar realmente su salida.
  • Intente reutilizar los mapas de bits en lugar de seguir decodificándolos.
  • Explore más opciones con el objeto BitmapFactory.Options (), por ejemplo, aumentar inSampleSize puede reducir la cantidad de memoria requerida por la imagen. p.ej
     BitmapFactory.Options o = new BitmapFactory.Options ();
     O.inSampleSize = 4;
     O.inDither = false;  // Deshabilitar el modo Dithering
     O.inPurgeable = true;  // Dile a gc que si necesita memoria libre, el mapa de bits se puede borrar
     MyBitMap = BitmapFactory.decodeResource (getResources (), ID, o);
    
  • Una solución complicada útil si no hay otras optimizaciones que realmente están funcionando para usted es que, usted puede coger la OutOfMemoryException y luego puede reducir la calidad a max .. es decir, la configuración de inSampleSize a 16. Se reducirá la calidad de sus imágenes, pero al menos Guardará su aplicación de estrellarse, hice esto en una de mi aplicación donde necesité cargar la imagen enorme de la PM en un mapa de bits.

Mi fragmento para obtener la imagen de la seguridad de los recursos. Puede establecer su propio sampleSize como umbral de calidad de imagen (un tamaño de sampleSize mayor es una calidad de imagen inferior).

 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; } } 
  • ¿Cómo implementar Google Maps dentro de un fragmento y usar el objeto GoogleMap?
  • Recolector de basura en Android
  • No se puede reanudar una actividad cuando se utiliza un viewPager
  • Android.util.AndroidRuntimeException: requestFeature () debe ser llamado antes de agregar contenido
  • ¿Cómo puedo escribir mediante programación un acceso directo a una página específica en la pantalla de inicio del lanzador de Android?
  • ¿Cómo puedo manejar múltiples clientes conectados a un servidor mediante sockets?
  • ¿Qué hace MessageDigest.update (byte )?
  • NetBeans con NBAndroid - no se puede encontrar el símbolo setContentView (R.layout.main);
  • Cómo almacenar Hashmap en Android para que se reutilice cuando la aplicación se reinicie con las preferencias compartidas?
  • Cómo gestionar varias tareas asíncronas de forma eficiente en Android
  • Android.intent.action.PACKAGE_ADDED BroadcastReceiver no recibe el tema añadido intención en JB 4.1
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.