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?
- ¿Por qué no termina esta actividad?
- Nuevo SDK de Google Analytics 4
- Cómo crear Flow TextView
- Llamar a servlet Java desde Android
- AndroidManifest.xml - especificado para la propiedad 'manifiesto' no existe
- Google firmado firmado apk no funciona
- Cómo configurar el fondo de Android PopupMenu a Blanco
- Android | SQLLite: Actualización de base de datos pre-creada sin utilizar SQLiteOpenHelper
- ¿Cómo puedo actualizar mi ListFragment cuando vuelve al diseño de la pila trasera?
- Obtención de excepción de conversión de clase durante el uso de android.support.v7.widget.SearchView
- ClassCastException: RestTemplate devuelve Lista <LinkedHashMap> en lugar de List <MymodelClass>
- vuforia AR SDK - no se puede reproducir video por url
- Comparar dos cadenas en Java
- 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; } }