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

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

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

Один из svg довольно большой (~ 5,8 МБ). При загрузке я получаю предупреждение «Нехватка памяти», после чего происходит сбой. Инструменты показывают виртуальную память на уровне 298,71 МБ и реальную память на уровне 149,10 МБ во время сбоя.

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

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


person invalidArgument    schedule 31.03.2014    source источник


Ответы (1)


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

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

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

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

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

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

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

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

person invalidArgument    schedule 26.06.2014