Actionscript 3: утечка памяти в приложении-опросе сервера - PullRequest
3 голосов
/ 23 февраля 2010

Я создаю инструмент удаленной презентации в AS3. Одним словом, один пользователь (докладчик) имеет доступ к HTML-странице «оглавление» со ссылками на каждый слайд в презентации, и произвольное количество зрителей может просматривать презентацию на другой странице, которая, в свою очередь, находится в форма SWF, которая опрашивает сервер каждую секунду, чтобы убедиться, что он находится на правом слайде. Всякий раз, когда администратор щелкает ссылку на слайд в оглавлении, база данных обновляется, и по своему следующему запросу swf презентации сравнивает метку слайда, который он отображает в данный момент, с ответом, полученным с сервера. Если ответ отличается от текущей метки, swf будет перемещаться по временной шкале, пока не найдет правильную метку кадра; в противном случае он ничего не делает и ожидает следующего результата опроса (через секунду).

Каждый слайд состоит из фрагмента ролика с собственной вложенной временной шкалой, которая повторяется до тех пор, пока слайд отображается. Нет ни одного сценария действий, управляющего вложенными мувиклипами, ни сценария действий на основной временной шкале, кроме stop(); s на каждом ключевом кадре (каждый из которых является слайдом в презентации).

Все построено и работает отлично. Единственное, что беспокоит, это то, что если swf-презентация открыта достаточно долго (скажем, 20 минут), опрос начинает заметно влиять на частоту кадров анимационных клипов на любом данном слайде. То есть каждую секунду заметно снижается частота кадров анимации, которая длится около трех десятых секунды, что весьма заметно (и, следовательно, является нарушителем условий для всего набора презентаций!).

Я знаю, что у AS3 есть проблемы с управлением памятью, и я старался быть осторожным в повторном использовании объектов и слушателей событий. Сам код очень прост; есть экземпляр Timer, который срабатывает каждую секунду, что вызывает new URLRequest для загрузки URLLoader. URLLoader повторно используется от вызова к вызову, в то время как URLRequest - нет (его нужно каждый раз инициализировать с новым значением уничтожения кэша, извлекаемым из вызова на new Date().time). Единственными объектами, созданными во всем классе, являются Timer, URLLoader, различные URLRequests (которые должны собираться мусором), и единственными прослушивателями событий являются Timer (добавленные один раз), URLLoader (добавлено один раз) и для процедур, которые перемещаются назад и вперед по временной шкале, чтобы найти правильный слайд (и они удаляются, когда найден правильный слайд).

Я использовал пакет статистики mr doob для мониторинга использования памяти, которое определенно возрастает со временем, поэтому где-то должна быть утечка (она увеличивается с ~ 30 МБ первоначально до> 200 МБ через некоторое время очистка и около 25 минут безотказной работы).

У кого-нибудь есть идеи относительно того, что может вызывать проблемы с производительностью?

ОБНОВЛЕНИЕ: Я не совсем уверен, что проблемы с производительностью связаны непосредственно с памятью; Я запустил экземпляр SWF-презентации в течение 15 минут, и хотя использование памяти возросло до 70 МБ (и осталось там), заметный сбой начал появляться с интервалами в одну секунду, совпадая с вызовами опроса (отслеживаемыми через панель Net Firebug Net ). Что еще может вызвать заикание видеоклипов?

Ответы [ 2 ]

0 голосов
/ 19 апреля 2010

Я знаю, что это немного поздно, но я часто использую профилировщик Flash Builder и обнаружил, что TimerEvent, сгенерированный классом таймера

  1. , использует довольно многобит памяти по отдельности и
  2. , похоже, не освобождается должным образом во время сборки мусора (даже если вы остановили таймер и удалили все ссылки на него).

Новое событие генерируется длякаждый Timer тик.Вместо этого я использую setInterval, хотя некоторые евангелисты AS3, кажется, рекомендуют против этого.Я не знаю почему.setInterval по-прежнему генерирует события таймера, но, похоже, со временем они должным образом собирают мусор.

Таким образом, одна стратегия может заключаться в том, что

  1. вы заменяете таймер вызовом setInterval() ... который в любом случае, возможно, является более надежным кодом, а
  2. (ВНИМАНИЕ) вызывает сборку мусора при каждом удалении слайдов (но не при каждом опросе).См. этот вопрос для получения более подробной информации о плюсах и минусах.

Второе предложение является лишь мерой временного ограничения.Я настоятельно рекомендую вам использовать инструменты профилирования, чтобы найти утечку.У Flash Builder Pro есть 60-дневная пробная версия, которая может помочь.

Наконец, при переходе к совершенно новому SWF-слайду (а не к новой позиции на временной шкале на текущем слайде), как вы убедитесь, что предыдущий слайдSWF выгружен правильно?Или я неправильно понимаю вашу настройку, и есть только один реальный слайд SWF?

0 голосов
/ 26 февраля 2010

Просто две вещи, которые пришли мне в голову:

  • В зависимости от версии Flash-плеера и использования процессора, сборка мусора иногда не запускается до того, как будет использовано 250 МБ (или даже больше) памяти.
  • Moviesclips, Sprites, Loader и все, что имеет прослушивание Eventlistener, не будут убиты сборщиком мусора.

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

Хорошая точка для начала чтения: http://www.gskinner.com/blog/archives/2006/06/as3_resource_ma.html

...