Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   MovieClip живет в нашей памяти (http://www.flasher.ru/forum/showthread.php?t=100234)

2morrowMan 23.08.2007 03:58

Может попробуй сделать список для хранения свох МувиКлипов(сам не тестил, писал находу):

Код:

var mсList:MovieClip = new MovieClip(); // хотя хватит и просто Sprite
addChild(mсList);

...

var mc = new myNewMc();
mc.addEventListener(MouseEvent.CLICK, mcClick);
mcList.addChild(mc);

...

function mcClick(event:MouseEvent):void
{
    DisplayObject(event.target).removeEventListener(MouseEvent.CLICK, mcClick);
    mcList.removeChild(DisplayObject(event.target));
    // Здесь может быть могут быть нюансы с event.target :)
}


etc 23.08.2007 09:49

removeChild не удалит клип из памяти, только из Display list.

2morrowMan 23.08.2007 11:21

Может быть проблема автора поста в том, что он создает обработчик события для МувиКлипа и не удаляет его (removeEventListener()) и потом GC не удаляет этот МувиКлип из памяти...

etc 23.08.2007 13:04

Какой обработчик? Нет там никаких обработчиков, я привел пример живущего клипа без всяких обработчиков.

MoHaX 23.08.2007 14:42

Да, всё хорошо..
Я разобрался с этим. Память просто отчищасется в редких случаях походу только когда её хватать перестаёт..

Dima_DPE 23.08.2007 15:17

__etc, обработчик там все таки есть. Откудато trace('hello') происходит же.
Удалив из первого кадра MyClip'а и написав так:
Код:

var mc:MovieClip = new MyClip();
mc.addEventListener('enterFrame', traceHello);
addChild(mc);

function traceHello(e:Event):void {
        trace('hello');
}


function clickHandler(event:Event):void {
        mc.removeEventListener('enterFrame', traceHello);
        removeChild(mc);
}
stage.addEventListener(MouseEvent.CLICK, clickHandler);

Все вроде кул.
Ну а если надо экземпляр класс удалить, то предлогаю написать функцию destroy
Код:

package {

        import flash.display.*;
        import flash.events.*;
       
        public class MyClip extends MovieClip {
       
                public function MyClip():void {
                        trace('myclip init');
                        this.addEventListener('enterFrame', traceHello);
                }
               
                private function traceHello(e:Event):void {
                        trace('hello');
                }
               
                public function destroy():void {
                        this.removeEventListener('enterFrame', traceHello);
                }
        }

}


MoHaX 23.08.2007 16:00

2Dima_DPE
Этот способ хорош для того чтобы подготовить клип к его смерти.
но в памяти он будет еще долго жить..
У __etcта тейс идёт не от Евента, а он того что клип зацикленно проигрывает анимацию на своём таймлайне. В следствии чего перед удалением клип лучше еще и остановить stop() чтобы успокоить его душу)

etc 23.08.2007 16:02

Dima_DPE, это не освободит память, уже проверено. Мы просто скрываем от себя самого существование клипа. Как тогда объяснишь принудительное срабатывание GC? Если ссылки есть, он не удалит клип никогда. Если удаляет, значит все-таки ссылок нет, но удаление не происходит автоматически.

7thsky™ 23.08.2007 16:37

Единственная проблемы с принудительным запуском GC - сколько времени это занимает, у меня заняло 7ms...

etc 23.08.2007 16:41

Сразу он не срабатывает, а во флексе даже на enterFrame не срабатывает. Возможно, это из-за иной схемы тестирования.


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

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