2014-11-08 3 views
3

Я разрабатываю игру с THREE.js, которая будет работать внутри UIWebView внутри приложения на iOS8.UIWebView Коллекция мусора Javascript с изображениями THREE.js

Я профилировал это приложение в инструментах разработчика Chrome и обеспечил отсутствие утечек памяти - то есть - использование памяти достигает определенного значения и остается постоянным на всем протяжении.

Выполнение этого приложения в UIWebView, однако, показывает, что использование памяти растет с течением времени, как будто сбор мусора вообще не происходит.

Я искал в Интернете, но не могу окончательно определить, имеет ли iOS8 UIWebView сбор мусора или нет. Некоторые статьи, похоже, предлагают, что это так, а некоторые - нет. Если это так - как я могу это вызвать?

Единственное решение, которое я могу себе представить, в это время, если сбор мусора периодически периодически убивает/освобождает UIWebView и воссоздает/перезапускает приложение (игра на экране меню).

UPDATE:

Проведя несколько дней ищет утечки вот что я нашел:

Deallocating UIWebView не работает - система не освобождает все (даже со всеми предложенными хаков) и проблемы с памятью усугубляются.

Я до сих пор не знаю, есть ли у UIWebView марка/сборщик мусора - панель Profile/Instruments, кажется, предлагает, но это не так. Здравый смысл подсказывает мне, что некоторая сборка мусора должна иметь место, потому что все временные объекты в коде и вещи, выходящие из области действия, очищаются.

Мои three.js объекты, кажется, не всегда собирать - но это может быть связано с three.js собственные проблемы того, чтобы вручную распоряжаться ресурсами (для того, чтобы освободить любые GL связанные ручки и т.д.)

Существуют загадочные утечки, связанные с .bind (this) - пример setTimeout (object.func.bind (object), 100) - по-видимому, никогда не очистят функцию после отправки таймаута - так что я заканчиваю предварительную привязку и сохраняю ее как var вместо. То же самое касается любых четных обработчиков, переданных jQuery.

Моя 2 игра сцены (сцена меню и игровая сцена), я закончил переписывание таким образом, что обе сцены остаются в памяти (никогда не удаляются). Любые объекты и модели, которые я создаю в игре, вместо того, чтобы полагаться на GC, чтобы получить собранные данные, перерабатываются вместо этого. Когда объекты удаляются со сцены, они помещаются в пул объектов того же типа для повторной инициализации и повторного добавления, когда такой объект требуется в сцене снова. Сначала это казалось излишним, но преимущество - отсутствие утечек памяти (объекты остаются выделенными) и более быстрое создание/добавление к сцене.

+0

Такая же проблема! Можете ли вы опубликовать образец своего кода? Надеюсь, кто-то может ответить на это. :) –

ответ

1

Память растет, потому что некоторые ресурсы кэшируются в памяти из-за стратегии кэширования HTTP. Поэтому, если память не растет бесконечно, не беспокойтесь об этом.

+1

К сожалению, это бесконечно растет.Примерно 4 Мб каждый раз я переключаю сцену в своей игре из меню в игру и обратно. –

1

То, что вы видите, вероятно, является ошибкой в ​​iOS8, где сборщик мусора никогда не освобождает память. Я разместил об этом здесь: PhoneGap using way more memory in iOS8 than iOS7

Если вы можете сообщить об ошибке Apple, чтобы мы могли установить это в следующей версии ОС.

Смежные вопросы