Рендеринг SVG в uiwebview вызывает давление памяти (и сбой приложения)

Я работаю над "интерактивной картой", похожей на этот пример. Мне нужно было иметь возможность увеличивать карту и при этом получать чистую иллюстрацию, поэтому рисование карты выполняется в svg (на самом деле она была создана в Illustrator, а затем сохранена в виде файла svg).

В приложении я создаю UIWebView и загружаю HTML, содержащий SVG. Файл HTML является ресурсом пакета в приложении, поэтому нет задержки в сети. Существуют настраиваемые фигуры, которые, когда вы нажимаете на них, переносят вас на другую карту (еще одну HTML-страницу с рисунком SVG).

Один из svg довольно большой (~5.8MB). При загрузке я получаю предупреждения "Memory Pressure", затем происходит сбой. Instruments показывает виртуальную память на 298,71 МБ и реальную память на 149,10 МБ в момент сбоя.

Я уже упростил рисование (я вытащил некоторые детали), а также использовал оптимизатор @Peter Collingridge svg.

Как я могу оптимизировать использование памяти, чтобы она не зависала?

1 ответ

Решение

Я решил свою проблему:

  • Я создавал веб-просмотр в моем viewWillAppear: метод, перед вызовом [super viewWillAppear:animated], Первоначально я сделал это, потому что у меня есть суперкласс, который создает общие элементы для всех имеющихся у меня карт и таким образом элементы отображаются в правильном порядке. Призыв к супер теперь сделан прежде всего, и я перенесу элементы на передний план.

  • Сейчас я устанавливаю свой веб-просмотр на ноль, прежде чем создавать и выдвигать другую карту (таким образом, другой веб-просмотр с другим контентом).

  • Первое веб-представление было создано раскадровкой. Теперь все сделано в коде.

  • Чертежи карт были упрощены, поэтому файлы легче по размеру. (Меньше деталей)

Отчет о памяти показывает, что объем используемой памяти сейчас составляет около 81,9 Мб (16,2% доступной памяти на iPod Touch 5-го поколения).

Мне показалось странным, что у меня появилось предупреждение о нехватке памяти с (довольно) небольшим SVG-файлом. Кроме того, датчик показал процент никогда не выше, чем 50%. Я не рассматривал движок JS и ограничения памяти webview. (Говорят, что движок Javascript получает полную мощность в iOS 8). (Я не смог найти никакой официальной документации об ограничении памяти, возможно, потому что она, кажется, варьируется от устройства к устройству. См. Этот ответ.)

В конце концов, загрузка страницы на моем iPhone 4s или iPod Touch 5-го поколения все еще продолжается, но это работает. Если вы хотите предложить лучший способ получить карту такого типа, вы можете это сделать.

Другие вопросы по тегам