2012-09-21 9 views
5

Recientemente me he enfrentado a un problema de administración de memoria en mi aplicación.Uso extremadamente alto de la memoria: ¿cómo manejar grandes imágenes en el iPad?

La aplicación tiene ventajas de algunas imágenes de alta calidad y esto aumenta extremadamente el uso de memoria.

Aquí están algunas informaciones sobre los proyectos e imágenes de detalles para hacer más clara la cuestión:

  • Hay alrededor de 90 imágenes añadidas a mi proyecto. La mitad de ellos están diseñados en tamaño @ 2x para admitir la nueva pantalla Retina para iPad. Por lo tanto, la cantidad máxima de imágenes para cada dispositivo es de alrededor de 45.

  • El tamaño total de la versión Retina de todas las imágenes es de alrededor de 25 MegaBytes (el tamaño de cada imagen individual es variable de 10 KB a 6.8 MB). Mientras tanto, el tamaño de todas las imágenes estándar es igual a 11 MegaBytes.

  • El tamaño del archivo XCode del proyecto es igual a 44 megabytes.

  • resolución máxima de imágenes Indivisual en versión estándar de imágenes es de alrededor de 1500x4000 píxeles, mientras que el mínimo es de alrededor de 60x60 píxeles.

  • La resolución máxima de las imágenes indivisuales en la versión Retina de las imágenes es de alrededor de 3000x8000 px, mientras que la mínima es de alrededor de 120x120 px.

  • La versión de Retina de las imágenes tiene el sufijo "@ 2x ~ ipad" en su nombre, mientras que el sufijo del nombre para los demás es "~ ipad".

  • Sólo hay una instancia de la mayoría de las imágenes se crea durante el ciclo de vida de aplicaciones.

  • Alrededor de 25 de las imágenes se cargan durante el lanzamiento de aplicaciones y el resto se cargan durante el juego.

  • He utilizado [UIImage imageNamed: @ "image_name.png"] donde quiera que cargue una imagen (usando [UIImage imageWithContentsOfFile] y [UIImage imageWithData] fue extremadamente ineficiente).

Pero aquí es que hay un problema:

Cuando rastrear el uso de la memoria utilizando instrumentos veo que el uso de memoria de aplicación es extremadamente alta. Estas son las estadísticas de la asignación de memoria en diferentes situaciones:

  • memoria asignada en el iPad 2 usando imágenes estándar en el inicio: 58 MB

  • memoria asignada en el iPad 2 usando imágenes estándar durante el juego (cuando todas las imágenes están cargados): 131 MB

  • memoria asignada en el nuevo iPad el uso de imágenes de la retina en el inicio: 211 MB
  • memoria asignada en el nuevo iPad el uso de imágenes de la retina durante el juego (cuando se cargan todas las imágenes): 470 MB

Cualquier idea por qué memoria asignada es mucho más alto que el tamaño total de las imágenes?

+0

¿Por qué está cargando todas las imágenes en la memoria? Debes evitar usar el UIImage imageNamed, y en su lugar usar UIImage imageWithContentsOfFile, ya que el último no está cargando la imagen permanentemente en la memoria ... Además, si tus imágenes son enormes, debes dibujarlas en una clase CATiledLayer, para que dibuje de manera más eficiente a la pantalla – Lefteris

+0

Estoy cargando todas las imágenes en la memoria porque todas son necesarias antes y durante el juego. No sigue un diseño habitual como otras aplicaciones, y se requiere cargar esas imágenes. En otras palabras, estoy cargando cada imagen solo cuando es necesario, pero el problema es que es necesario que todas ellas se carguen al inicio: D –

Respuesta

0

Esto es probablemente debido al hecho de que las imágenes que utiliza están comprimidas con png o jpg, y cuando se decodifican en la memoria son de un tamaño mucho mayor que el tamaño del archivo original. Tomará algo como ancho * alto * 4 bytes de memoria sin importar el contenido de la imagen.

+0

¿Hay algún otro método de compresión o cualquier otra extensión que pueda usar para evitar tal uso de memoria enorme? –

0

un comienzo sería no uso -[UIImage imageNamed:] para las imágenes que se ajustan a cualquiera de las calificaciones:

  • gran tamaño
  • tamaño mediano
  • "... sólo una instancia ... creado durante la aplicación ciclo vital."

pero debe prestar atención a cómo esos cambios afectan su programa. en la actualidad, confías en la memoria siempre que sea posible. Lo que sugiero es cambiar algunas de esas responsabilidades a otras áreas. distribuya la carga para que aún se sienta rápido, pero tenga un mejor equilibrio de recursos. una vez que utiliza menos almacenamiento en caché, notará que puede terminar leyendo y expandiendo algunos archivos más de uno una vez. luego intenta averiguar dónde debes compartir las imágenes que cargas. por supuesto, cargue solo lo que necesita. luego toma lo que aprendes y ve que puede aplicarse al resto de tus imágenes.

Además, rompa sus imágenes: tiene imágenes que son varias veces más grandes que el tamaño de la pantalla. si necesitan ser de ese tamaño, divídalos; si solo se reducen cuando se presentan, cambie su tamaño antes de la distribución (p. ej., para que no requieran escalado), será mucho más rápido de visualizar, se verá mucho mejor, y consume menos memoria).

Cuestiones relacionadas