![]() |
Тормоза при отрисовке через время
Здравствуйте!
Есть флешка, которая представляет собой что-то вроде видео плеера. На ней есть кнопка плея и паузы. http://img-fotki.yandex.ru/get/3209/...7b06e277_M.jpg Когда система играет, то проигрывается видео, рисуется несколько графиков, еще двигается несколько мувиклипов, изменяются лейблы. Также, используется свой курсор-муви клип... Короче, происходит много перерисовок. Через примерно минут 20 все начинает прилично тормозить и чем дальше тем хуже. Самое непонятное то, что тормозит даже если выключить плей, то есть остановить всякие отрисовки. От тормозов помогает избавиться только перегрузка страницы. Эксперименты показали, что, видимо, что-то происходит с рисованием. Например если понизить качество, то станет быстрее. Конечно понимаю, что скорее всего дело в руках, но может быть я что-то упустил? Может можно как-то что-то очищать, какой-нибудь буфер рисования? Есть мысли что это может быть? И еще, есть ли какие-нибудь средства профилировки для флеша? Как можно отладиться в такой неприятной ситуации? Добавлено через 20 часов 41 минуту Совсем никаких идей? |
дело в использовании памяти и жестких ссылках на объекты.
|
Проверьте не создается ли каких нибудь объектов на сцене которые периодически с нее удаляются и должны убираться мусорщиком. Скорей всего такие объекты есть, и они подписаны на события, или увязаны с потоковым видео или музыкой. Перед их удалением необходимо убить все ссылки которые могут быть с ними свзяаны, в том числе все подписки.
|
Может быть мемори-лики, но есть подозрение, что автор не очищает graphics при перерисовке. Симптоматика похожая.
Код в студию. Или хотя б тот участок, где производится отрисовка. |
Не забываем отписываться от ENTER_FRAME всегда и везде!!!
|
Ух, а я уже потерял надежду.
Fillini, как можно проверить использование памяти? Что вы имеете в виду под «жесткими ссылками на объекты»? SunShadow, вроде таких объектов нет. Периодически меняются только графики, но это простые lineTo, moveTo. Остальные объекты создаются один раз, а потом просто двигаются или скрываются. Как можно проверить, что все именно так как я думаю? ...есть подозрение, что автор не очищает graphics... Нет, тут вроде все нормально. Я, вообще, использую haXe. Процедуры прорисовки все примерно такие: Код AS3:
тут вроде все нормально. Я использую такого предка для всех визуальных контролов: Код AS3:
|
>>тормозит даже если выключить плей, то есть остановить всякие отрисовки
т.е. тормоза не в самой отрисовке, а выводе нарисованного на экран я бы попробовал сразу после каждой отрисовки перегонять все в битмап, а graphics очищать |
Во Флексе есть профайлер... других вроде нету... Ну можно потрейсить System.totalMemory но это как бы мало поможет - все равно что на таск-менеджер посмотреть :)
|
Память можно посмотреть и ctrl+alt+delete. Если память все время увеличивается значит дело в жестких ссылках.
листенеры правильно писать так Код AS3:
примерно вот таким кодом Код AS3:
|
Цитата:
я бы сказал, что листенеры можно писать и так, если лень или некогда построить нормальную структуру |
wvxvw,
читал про флексовый профйлер, но, к сожалению, в haXe его не получится использовать. Может есть профилировщика, которые работают со скомпилированными флешками? Fillini, ctrl+alt+delete — не самый точный детектор утечек. Хотя проверилял и им. Память «жрется», но достаточно медленно. >листенеры правильно писать так Странная фраза. Если такой набор параметров единственно правильный, как вы говорите, то почему тогда их можно изменять? Я за сомневался и решил прочесть справку. Вы рекомендовали всегда подписываться на события так: Код AS3:
Первые два параметра такие же по-умолчанию, разница только в useWeakReference. Fillini, почему нужно всегда использовать useWeakReference? >так же не забываем очищать DisplayList. А где это надо делать? А нет ли возможности управлять сборщиком мусора? Удалять вручную или по команде? Добавлено через 2 часа 26 минут Нашел причину тормозов. Причина, конечно, была в руках. Проблема была в том, что из-за ошибки перерисовка вызывалась слишком часто. При плее вместо 1 раза каждые 100 мс, делалось 3-4 перерисовки. Тем не менее, думаю вопрос закрывать не стоит, так как, я думаю, исправление ошибки просто значительно растянуло во времени наступление тормозов. |
параметр useWeakReference в листенерах говорит GC о том что как только объект был удален с DisplayList, и все ссылки на него выставлены NULL он становится доступным для сборки мусора.
GC вручную управлять невозможно. Очищать DisplayList: Например есть какой нибудь мувик служащий контейнером в который постоянно добавляется содержимое (addChild()). Объект не может быть удален из памяти пока: 1. Есть хоть одна ссылка на этот оъект 2. Есть хоть один не отписанный листенер. Чтоб эти принебреч используем useWeakReference 3. Объект находится в DisplayList. чтобы удалить объект из DisplayList. вызываем removeChild, removeChildAt |
Благодарю Fillini, просмотрю код, но у меня только мувик-курсор меняется. Все остальное создается один раз.
|
| Часовой пояс GMT +4, время: 01:32. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.