2009-12-16 22 views
6

Estoy trabajando en un juego para iPhone que usa un MKMapView como campo de juego. Después de solo un par de minutos de juego, la aplicación inevitablemente comienza a ponerse lenta y eventualmente se cuelga debido a la poca memoria. Después de indagar sobre el culpable, parece ser que la vista del mapa exige constantemente más memoria. El juego requiere una gran cantidad de zoom y panorámica del mapa, así que solo puedo suponer que el caché de teselas del mapa sigue creciendo hasta que se queda sin memoria. ¿Hay alguna forma de forzar la vista del mapa para vaciar su caché de teselas o contener su consumo de memoria?¿Borrar la caché de teselas de MKMapView?

+0

Estoy teniendo este mismo problema Mattia. ¡A todos nos gusta decir "alfileres ololol, fugas"! pero no, MKMapView en realidad se traga enormes cantidades de RAM y empeora con diferentes niveles de zoom. Trabajando en el problema ahora mismo, espero encontrar algo. –

Respuesta

4

* NOTA: Esta respuesta sólo es relevante para iOS 4.1 y superior. Los problemas descritos en esta respuesta se corrigieron principalmente en iOS 4.2 *

He estado investigando sobre esto ya que mi aplicación utiliza tanto el mapa como otras características que requieren una gran cantidad de RAM.

No he encontrado una respuesta, pero una solución. Las demandas de memoria de MKMapView aumentan de forma exponencial a medida que se acerca más a un área y se desplaza dentro de ese área ampliada.

Hay dos niveles de caché de mosaico MKMapView. Uno se manifiesta como Malloc ~ 196kb en Instruments, el otro es NSData (store) de diferentes tamaños.

El Malloc parece ser el mosaico activo en uso, y hay un límite máximo de cuántos se pueden asignar. En mi aplicación, ese número es 16, no estoy seguro si está basado en el tamaño de UIView o no. Estas asignaciones parecen ser estrictamente administradas, y responde a las advertencias de memoria.

De todos modos, en un cierto nivel de zoom, por ejemplo, nivel continente (suficiente para adaptarse a la mayor parte de América del Norte en una pantalla de iPad), dado el tamaño de las teselas, si realmente no tiene que llegar a ese segundo nivel de almacenamiento en caché (NSData (Tienda)) para completar el mapa. Todo es fresco y limpio. Si cargo una tonelada de imágenes externas en la memoria activa, las fichas se podan. ¡Increíble!

El problema aparece cuando alcanza el segundo nivel de almacenamiento en caché. Esto sucede cuando haces zoom, y de repente en lugar de 16 fichas para mostrar todo el planat, necesita 16 fichas solo para presumir de Los Angelas, y mientras das una vuelta en lugar de simplemente tirar esas fichas viejas, las pone en el NSData (tienda)) asignaciones donde parecen nunca ser liberados.

Este NSData (tienda) es el NSURLConnectionCache que existe de forma predeterminada solo en la memoria. No puede acceder a este caché para limitarlo, porque no es el caché compartido predeterminado (ya lo intenté).

Así que aquí es donde me quedo atascado.

La respuesta insatisfactoria es que si deshabilita el zoom del mapa y lo repara a un nivel de zoom razonablemente amplio, puede evitar este problema por completo, pero obviamente algunas aplicaciones lo necesitan ... y eso es todo lo que tengo.

Archivé un ticket de soporte con Apple para ver si pueden divulgar alguna manera de limitar este ridículo caché para el mapa (que, por cierto, pude poner en marcha casualmente hasta 50+ megs de RAM asignados en la memoria activa) .

Espero que esto ayude.

edición

La próxima versión de iOS parece haber resuelto este problema caché ilimitada. MKMapView ahora corta de forma agresiva sus datos de teselas en caché. ¡ALEGRARSE!

+0

Si bien, como mencionó, no soluciona la situación, al menos da un diagnóstico bastante bueno. Gracias por investigar y compartir los resultados. – Mattia

+0

Hola Mattie, agregué una edición ... la próxima versión de iOS corrige este problema. –

2

¿Está estableciendo el identificador de reutilización en las vistas de anotación? (Esto significa que el sistema puede separar esas vistas y solo mantener un pequeño número de vistas en la memoria al mismo tiempo. También aumenta el rendimiento del desplazamiento, porque el desplazamiento reutilizará las vistas separadas.)

Utilice este método para obtener una vista de anotación ser reutilizados:

- (MKAnnotationView *)dequeueReusableAnnotationViewWithIdentifier:(NSString *)identifier 
+0

Gracias por la respuesta. De hecho, estoy usando identificadores de reutilización para las vistas de anotación, así que ese no debería ser el problema, pero los verificaré nuevamente para asegurarme. – Mattia

1

Si crea una aplicación con solo el kit de mapas y un tamaño de vista de 768x1024 (tamaño de ipad), la aplicación puede consumir fácilmente más de 30 MB de "Live Bytes" como informa el programa de asignaciones de instrumentos. Esto se notó corriendo en el iPad iOS v3.2.2 (la última versión hasta la próxima semana supone la versión 4.2). De mi investigación parece que esta cantidad de memoria es mucho para una sola aplicación, donde la mayoría de los desarrolladores informan que reciben una advertencia de memoria de nivel 1 de entre 15 y 25 MB y se bloquea poco después de ese nivel.

Cuestiones relacionadas