Я создаю инструмент удаленной презентации в 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 ). Что еще может вызвать заикание видеоклипов?