Очистить кэш плиток MKMapView? - PullRequest
       12

Очистить кэш плиток MKMapView?

6 голосов
/ 16 декабря 2009

Я работаю над игрой для iPhone, которая использует MKMapView в качестве игрового поля. После пары минут воспроизведения приложение неизбежно начинает тормозить и в конечном итоге зависает из-за нехватки памяти. После копания вокруг виновника кажется, что вид карты постоянно требует больше памяти. Игра требует большого масштабирования и панорамирования карты, поэтому я могу только предположить, что кэш тайлов карты просто продолжает расти, пока не исчерпает память. Есть ли способ заставить вид карты очистить кэш тайлов или ограничить потребление памяти?

Ответы [ 3 ]

4 голосов
/ 01 ноября 2010

* ПРИМЕЧАНИЕ. Этот ответ относится только к iOS 4.1 и ниже. Проблемы, описанные в этом ответе, были в основном исправлены в iOS 4.2 *

Я занимался этим, поскольку мое приложение использует как карту, так и другие функции, требующие большого объема оперативной памяти.

Я не нашел ответа, но есть обходной путь. Требования к памяти MKMapView увеличиваются по экспоненте, когда вы приближаетесь к области и перемещаетесь в пределах этой увеличенной области.

Существует два уровня кэша плиток MKMapView. Один проявляет себя как Malloc ~ 196kb в инструментах, другой - NSData (хранилище) разных размеров.

Malloc, похоже, является активными используемыми тайлами, и существует жесткое ограничение на их количество. В моем приложении это число 16, не уверен, основано ли оно на размере UIView или нет. Кажется, что эти распределения строго управляются, и это отвечает на предупреждения памяти.

В любом случае, при определенном уровне масштабирования, скажем, уровне континента (достаточном для того, чтобы вместить большую часть Северной Америки на экране iPad), учитывая размер фрагментов, если вообще никогда не нужно переходить на этот второй уровень кэширования (NSData (Магазин)), чтобы завершить карту. Все свежее и чистое. Если я загружаю тонну внешних изображений в активную память, плитки сокращаются. Отлично!

Проблема возникает, когда он достигает второго уровня кэширования. Это происходит, когда вы увеличиваете изображение, и внезапно вместо 16 плиток, чтобы показать весь планет, ему нужно 16 плиток, чтобы просто показать Лос-Анджелес, и, когда вы перемещаетесь, вместо того, чтобы просто сбросить эти старые плитки, они помещают их в NSData ) ассигнования, где они, кажется, никогда не освобождаются.

Этот NSData (хранилище) является NSURLConnectionCache, который по умолчанию существует только в памяти. Вы не можете получить доступ к этому кешу, чтобы ограничить его, потому что это не общий кеш по умолчанию (уже пробовал).

Так вот где я застрял.

Неудовлетворительный ответ заключается в том, что если вы отключите масштабирование карты и установите его на достаточно широком уровне масштабирования, вы сможете полностью избежать этой проблемы, но, очевидно, это требуется некоторым приложениям ... и это, насколько я понял.

Я подал заявку в службу поддержки Apple, чтобы узнать, могут ли они разглашать каким-либо образом ограничить этот нелепый кеш для карты (который, кстати, мне удалось случайно увеличить до 50+ мегабайт ОЗУ, выделенных в активной памяти).

Надеюсь, это поможет.

редактировать

Следующий релиз iOS, похоже, решил эту проблему с неограниченным кешем. MKMapView теперь активно сокращает свои кэшированные данные тайлов. Радуйся

2 голосов
/ 17 декабря 2009

Вы устанавливаете идентификатор повторного использования в своих представлениях аннотации? (Это означает, что система может отключить эти представления и одновременно сохранить в памяти только небольшое количество представлений. Это также увеличивает производительность прокрутки, поскольку при прокрутке будут повторно использоваться отдельные представления.)

Используйте этот метод для повторного использования представления аннотации:

 - (MKAnnotationView *)dequeueReusableAnnotationViewWithIdentifier:(NSString *)identifier
1 голос
/ 17 ноября 2010

Если вы создаете приложение только с mapkit и размером представления 768x1024 (размер ipad), приложение может легко потреблять более 30 МБ «живых байтов», как сообщает программа Instruments Allocations. Это было замечено при работе на iPad iOS v3.2.2 (последняя версия до следующих недель предполагала выпуск 4.2). Из моих исследований кажется, что этот объем памяти много для отдельного приложения, где большинство разработчиков сообщают о получении предупреждения уровня памяти около 15-25 МБ и вылетает вскоре после этого уровня.

...