¿Por qué todos mis mapas de bits sobresalen un 200%?

Estoy teniendo graves problemas de memoria en mi aplicación [1]. Con el fin de investigar esto, tomé heapdumps de mi aplicación en diferentes estados. Vi que algunos mapas de bits estaban tomando enormes cantidades de memoria. Escribí una pequeña herramienta [2] que decodifica los arrays de bytes a archivos de mapa de bits de Windows (.bmp), para que pueda ver los mapas de bits y compararlos con los archivos que tengo en mi carpeta res/drawable .

Lo que he descubierto es que todos mis archivos son upsampled dos veces.
Primero comprobé con el más grande tenía: un almacenador intermediario de la matriz del byte de más de 9MB en el montón, que fue descodificado para ser una imagen agradable 1920×1280, mientras que el original era un archivo del png 960×640.
Intenté con el segundo más grande, sobre 3MB, que una vez descodificado demostró una imagen agradable de 754×1200, el tamaño original era … adivina qué? Un buen archivo jpg de 377×600.

¿Lo que da?

He habilitado la aceleración HW en mi archivo de manifiesto de Android (aunque no estoy seguro de que realmente lo necesite, sólo estoy usando algunas vistas y actividades básicas).
Estoy funcionando el androide 4.0.2 de la acción en un Nexus de la galaxia del G / M (yakju). Estoy recibiendo retroalimentación de mis probadores que el problema está presente en su 4.0.3 Nexus S, aunque no pude verificar sus vertederos de pila todavía.

Estoy tratando de ahorrar memoria aquí, si Android duplica todo, no es de extrañar que la aplicación se bloquee rápidamente porque el uso de montón se vuelve demasiado alto (alrededor de 64 MB en mi caso). Espero que haya una razón y una manera alrededor de ella.

Referencias:

  1. OutOfMemoryError al cargar las actividades
  2. Cómo ver realmente un mapa de bits tomado de un volcado de montón de Android

One Solution collect form web for “¿Por qué todos mis mapas de bits sobresalen un 200%?”

Cuando pones imágenes en res/drawable , Android asumirá que tienen un dpi de 160, es decir, es lo mismo que ponerlas en res/drawable-mdpi . Galaxy Nexus es un dispositivo xhdpi, es decir, tiene un dpi (generalizado) de 320. Para compensar la pantalla de alta resolución, Android subirá de tamaño las imágenes con un 200%.

La solución es simple, basta con poner las imágenes en res/drawable-xhdpi en res/drawable-xhdpi lugar. A continuación, el dpi declarado de las imágenes coincidirá con la pantalla en la que se ejecuta, y Android no realizará ninguna escala de las imágenes.

Consulte http://developer.android.com/guide/practices/screens_support.html para obtener más información.

  • Problema de memoria mientras maneja y procesa múltiples mapas de bits grandes
  • El montón de memoria de aplicaciones de Android sigue creciendo
  • ¿Estrategia de la fragmentación del montón del androide?
  • Cómo aumentar el tamaño máximo heap del dispositivo virtual de Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.