Рендеринг svg в uiwebview вызывает сжатие памяти (и сбой приложения)
Я работаю над "интерактивной картой", аналогичной этому примеру. Мне нужно было увеличить масштаб карты и при этом получить чистую иллюстрацию, поэтому рисование карты выполняется в svg (на самом деле она была создана в Illustrator, а затем сохранена в файле svg).
В приложении я создаю UIWebView и загружаю html, содержащий svg. HTML-файл является ресурсом пакета в приложении, поэтому нет никакой сетевой задержки. Есть таппируемые формы, которые, когда вы касаетесь их, это приводит вас к другому карта (еще одна html-страница с чертежом svg).
Один из svg довольно большой (~5,8 МБ). При загрузке я получаю предупреждения "давление памяти", а затем он падает. Приборы показывают виртуальную память на 298,71 МБ и реальную память на 149,10 МБ в момент аварии.
Я уже упростил чертеж (вынул некоторые детали), а также использовал @Peter Collingridge svg optimizer.
Как я могу оптимизировать использование памяти, чтобы она не зависала?
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-го поколения, но это работает. Если вы хотите предложить лучший способ чтобы достичь такого рода карты, вы можете сделать это.