Ответ 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, потому что у него часто не хватало памяти и сбоев. Для других устройств я нашел, что все в порядке.
Некоторые идеи для возможных обходных решений могут заключаться в уменьшении размера вида карты или привязке уровня масштабирования к интегральному значению. Ни один из них не будет отличным для пользователя, но они могут помочь избежать сбоя.