Изобразяването на svg в uiwebview причинява натиск върху паметта (и срив на приложението)

Работя върху „интерактивна карта“, подобна на този пример. Трябваше да мога да увелича картата и пак да получа чиста илюстрация, така че чертането на картата е направено в svg (всъщност беше създадено в Illustrator, след това запазено като svg файл).

В приложението създавам UIWebView и зареждам html, съдържащ svg. HTML файлът е пакетен ресурс в приложението, така че няма забавяне в мрежата. Има форми с възможност за докосване, които, когато ги докоснете, ви отвеждат до друга карта (друга html страница със svg чертеж).

Един от svg е доста голям (~5,8 MB). При зареждане получавам предупреждения „Налягане на паметта“, след което се срива. Instruments показва виртуална памет на 298,71MB и реална памет на 149,10MB по време на срива.

Вече опростих чертежа (извадих някои детайли) и също използвах @Peter Collingridge svg optimizer.

Как мога да оптимизирам използването на паметта, така че да не се срине?


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


Отговори (1)


Реших проблема си:

  • Създавах уеб изгледа в моя viewWillAppear:метод, преди да извикам [super viewWillAppear:animated]. Първоначално направих това, защото имам супер клас, който инстанцира общи елементи за всички различни карти, които имам, и по този начин елементите се появиха в правилния ред. Обаждането до super вече е направено преди всичко друго и аз пренасям елементите отпред.

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

  • Първият уеб изглед е създаден от сценария. Сега всичко е направено в код.

  • Чертежите на картите са опростени, така че файловете са с по-лек размер. (По-малко подробности)

Докладът за паметта показва, че използваната памет сега е около 81,9 Mb (16,2% от наличната памет на iPod Touch 5-то поколение).

Намерих странно, че имах предупреждение за натиск върху паметта с (доста) малък svg файл. Освен това измервателният уред показа процент, който никога не надвишава 50%. Не обмислях JS двигателя и ограниченията на паметта на webview. (Твърди се, че двигателят на Javascript ще получи пълна мощност в iOS 8, както се съобщава тук). (Не можах да намеря никаква официална документация относно ограниченията на паметта, вероятно защото изглежда, че варира от устройство на устройство. Вижте този отговор.)

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

person invalidArgument    schedule 26.06.2014