Я создаю инструмент удаленной презентации в AS3. Короче говоря, один пользователь (докладчик) имеет доступ к HTML-странице «оглавления» со ссылками на каждый слайд в презентации, а произвольное количество зрителей может смотреть презентацию на другой странице, которая, в свою очередь, находится в форма SWF, который каждую секунду опрашивает сервер, чтобы убедиться, что он находится на правильном слайде. Всякий раз, когда администратор щелкает ссылку слайда в оглавлении, база данных обновляется, и при следующем запросе SWF-файл презентации сравнивает метку слайда, отображаемого в данный момент, с ответом, полученным от сервера. Если ответ отличается от текущей метки, swf просматривает временную шкалу, пока не найдет правильную метку кадра; в противном случае он ничего не делает и ждет следующего результата опроса (через секунду).
Каждый слайд состоит из фрагмента ролика с собственной вложенной временной шкалой, которая зацикливается, пока отображается слайд. Нет сценария действий, управляющего каким-либо вложенным мувиклипом, и нет никакого сценария действий на основной временной шкале, кроме stop();
s на каждом ключевом кадре (каждый из которых является слайдом в презентации).
Все построено и работает отлично. Единственное, что настораживает, это то, что если презентационный swf открыт достаточно долго (скажем, 20 минут), то опрос начинает заметно влиять на частоту кадров мувиклипов, анимируемых на том или ином слайде. То есть каждую секунду происходит заметное падение частоты кадров анимации, которая длится около трех десятых секунды, что довольно заметно (и, следовательно, является нарушением условий для всего набора презентаций!).
Я знаю, что в AS3 есть проблемы с управлением памятью, и я старался быть усердным в повторном использовании объектов и прослушивателей событий. Сам код предельно прост; есть экземпляр Timer
, который срабатывает каждую секунду, что вызывает загрузку new URLRequest
экземпляром URLLoader
. URLLoader
повторно используется от вызова к вызову, а URLRequest
— нет (его необходимо каждый раз инициализировать новым значением уничтожения кеша, полученным из вызова new Date().time
). Единственными объектами, созданными во всем классе, являются Timer
, URLLoader
, различные URLRequests
(которые должны быть удалены сборщиком мусора), и единственными прослушивателями событий являются Timer
(добавлены один раз), URLLoader
(добавлены один раз) и подпрограммы, которые перемещаются назад и вперед по временной шкале, чтобы найти правильный слайд (и они удаляются, как только правильный слайд найден).
Я использую пакет статистики мистера Дуба для мониторинга использования памяти, что определенно со временем увеличивается, поэтому где-то должна быть утечка (она увеличивается с ~ 30 МБ изначально до> 200 МБ после некоторой очистки и около 25 минут безотказной работы).
У кого-нибудь есть идеи относительно того, что может быть причиной проблем с производительностью?
ОБНОВЛЕНИЕ: я не совсем уверен, что проблемы с производительностью напрямую связаны с памятью; Я запускал экземпляр презентационного swf примерно на 15 минут, и хотя использование памяти увеличилось только до 70 МБ (и осталось там), с интервалом в одну секунду начала появляться заметная икота, совпадающая с вызовами опроса (отслеживается с помощью панели Firebug Net). ). Что еще может вызвать заикание видеоклипов?