GMSMapView: как управлять памятью?

Мое приложение использует GMSMapView в подвью, а использование памяти выглядит следующим образом:

  • 1,25 МБ до доступа к карте;
  • 21,5 МБ после первого доступа к карте;
  • 30 МБ (а иногда и выше 30) после масштабирования и панорамирования

Никаких утечек, насколько я могу судить с помощью инструментов. Проблема в том, что я получаю предупреждения о памяти и часто отключается при отключении приложений. Очевидно, что GoogleMaps использует львиную долю в памяти приложения. Как я могу отпустить некоторые из них в didReceiveMemoryWarning()?

Возможно ли иметь Google Maps в приложении и управлять его использованием памяти, по крайней мере, чтобы предотвратить его выключение из памяти?

Это GoogleMaps-iOS-1.3.0.

Update:

Мои цифры памяти были в порядке (использовал инструмент "Отчисления" вместо "Монитор активности" ). Вот правильные значения:

  • 8.8 MB перед доступом к карте
  • 57 МБ после первого доступа к карте.
  • 65 МБ, с шипами около 80 МБ. после масштабирования и панорамирования

Это явно находится в диапазоне "проблем" для ОЗУ 256 МБ (iPod Touch 4G, например), и объясняет предупреждения памяти и случайные удары.

Кто-нибудь успешно запускает Google Maps в приложении на устройстве с 256 МБ?

Ответ 1

API карт использует плитки размером 256 х 256 пикселей. Они загружаются в память как 32 бита на пиксель, поэтому они будут использовать 256 х 256 х 4 = 256 кб на плиту.

Если у вас есть iPad размером 1024 x 768, вам понадобится 4 x 3 = 12 фрагментов = 3 МБ. Однако это только в том случае, если ваше представление будет идеально согласовано с границами плитки - на практике это пересечет границы, и поэтому вам, вероятно, понадобится 5 x 4 = 20 плиток = 5 МБ.

Однако, если вы уменьшите масштаб до почти той точки, в которой будет отображаться следующий более низкий уровень масштабирования, каждая плитка будет нарисована чуть более половины ее полного размера, и вам понадобится 10 x 8 = 80 фрагментов = 20 МБ.

Затем, если у вас есть устройство Retina, оно фактически загрузит следующие более высокие уровни масштабирования и, следовательно, потребует в два раза больше их в каждом измерении (в соответствии с пикселями пикселей не точек), и поэтому вам понадобится 20 x 16 = 320 плиток = 80 МБ.

Аналогичные вычисления для iPhone 5 составляют 240 фрагментов = 60 МБ.

Итак, если вы подсчитаете объем памяти, который требуется карте, только для плиток, не считая каких-либо накладных расходов или другой памяти, используемой для внутренней обработки, она работает довольно много. Так что, возможно, вы ничего не можете сделать. Карты SDK уже освобождают неиспользуемые плитки при наличии давления в памяти - но они не могут освобождать плитки, необходимые для отображения текущего вида.

Это означает, что единственным вариантом может быть сокращение использования памяти в вашем собственном коде.

Для моего приложения мне пришлось изменить способ работы на iPad 1, потому что у него часто не хватало памяти и сбоев. Для других устройств я нашел, что все в порядке.

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

Ответ 2

Попробуйте использовать этот код в контроллере вашего вида:

- (void)viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:animated] ;
    [m_mapView clear];
    [m_mapView stopRendering] ;
    [m_mapView removeFromSuperview] ;
    m_mapView = nil ;
}

Я пробовал это, и он освобождает некоторую память GMSMapView.

Ответ 3

Я также застрял в огромной памяти, используемой GMSMapview. Это серьезная проблема в google map sdk, и я думаю, что команда Google работает над этим. Они также исправили некоторые проблемы с памятью в версии 1.9.0 Другие способы уменьшить память -

  • Уменьшите размер GMSMapView как можно меньше

  • Используйте последнюю версию 1.9.0 - как и в октябре 2014 года.

Используйте следующую ссылку для загрузки последних sdk -

https://developers.google.com/maps/documentation/ios/releases