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


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

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

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

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

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

1 6

1 ответ:

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

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

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

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

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

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

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

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