Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Тормоза при отрисовке через время (http://www.flasher.ru/forum/showthread.php?t=121700)

Kolan 20.02.2009 19:56

Тормоза при отрисовке через время
 
Здравствуйте!

Есть флешка, которая представляет собой что-то вроде видео плеера. На ней есть кнопка плея и паузы.
http://img-fotki.yandex.ru/get/3209/...7b06e277_M.jpg

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

Через примерно минут 20 все начинает прилично тормозить и чем дальше тем хуже. Самое непонятное то, что тормозит даже если выключить плей, то есть остановить всякие отрисовки. От тормозов помогает избавиться только перегрузка страницы.

Эксперименты показали, что, видимо, что-то происходит с рисованием. Например если понизить качество, то станет быстрее.

Конечно понимаю, что скорее всего дело в руках, но может быть я что-то упустил? Может можно как-то что-то очищать, какой-нибудь буфер рисования?

Есть мысли что это может быть?

И еще, есть ли какие-нибудь средства профилировки для флеша? Как можно отладиться в такой неприятной ситуации?

Добавлено через 20 часов 41 минуту
Совсем никаких идей?

Fillini 24.02.2009 11:28

дело в использовании памяти и жестких ссылках на объекты.

SunShadow 24.02.2009 12:05

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

Ромастый 24.02.2009 15:08

Может быть мемори-лики, но есть подозрение, что автор не очищает graphics при перерисовке. Симптоматика похожая.
Код в студию. Или хотя б тот участок, где производится отрисовка.

Vreden 24.02.2009 15:50

Не забываем отписываться от ENTER_FRAME всегда и везде!!!

Kolan 24.02.2009 17:11

Ух, а я уже потерял надежду.

Fillini,
как можно проверить использование памяти? Что вы имеете в виду под «жесткими ссылками на объекты»?

SunShadow,
вроде таких объектов нет. Периодически меняются только графики, но это простые lineTo, moveTo. Остальные объекты создаются один раз, а потом просто двигаются или скрываются.
Как можно проверить, что все именно так как я думаю?

...есть подозрение, что автор не очищает graphics...
Нет, тут вроде все нормально. Я, вообще, использую haXe. Процедуры прорисовки все примерно такие:
Код AS3:

override public function draw() {
  var g:Graphics = this.graphics;
  g.clear();
...

Vreden,
тут вроде все нормально. Я использую такого предка для всех визуальных контролов:
Код AS3:

class Control extends MovieClip{
...
 
public function invalidate()
{
        addEventListener(Event.ENTER_FRAME, onInvalidate);
}
 
private function onInvalidate(event:Event)
{
        removeEventListener(Event.ENTER_FRAME, onInvalidate);
        draw();
}
 
public function draw() {
        dispatchEvent(new Event(Control.DRAW));
}
 
 
}

то есть, как видите, отписка происходит автоматически.

silin 24.02.2009 17:41

>>тормозит даже если выключить плей, то есть остановить всякие отрисовки

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

wvxvw 24.02.2009 17:51

Во Флексе есть профайлер... других вроде нету... Ну можно потрейсить System.totalMemory но это как бы мало поможет - все равно что на таск-менеджер посмотреть :)

Fillini 25.02.2009 09:48

Память можно посмотреть и ctrl+alt+delete. Если память все время увеличивается значит дело в жестких ссылках.
листенеры правильно писать так
Код AS3:

addEventListener(Event.ENTER_FRAME, onInvalidate, false,0,true);

так же не забываем очищать DisplayList.
примерно вот таким кодом
Код AS3:

 
while(numChildren-1)
{
        removeChildAt(0);
}


silin 25.02.2009 11:25

Цитата:

Сообщение от Fillini (Сообщение 800929)
листенеры правильно писать так
Код AS3:

addEventListener(Event.ENTER_FRAME, onInvalidate, false,0,true);


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


Часовой пояс GMT +4, время: 22:36.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.