Форум 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=140685)

ignition 05.06.2010 11:58

Как очистить память при работе с массивом MovieClip'ов?
 
Как очистить память при работе с массивом MovieClip'ов? Что нужно сделать, чтобы при подгрузке очередного MovieClip'а предыдущий выгружался из памяти? Сейчас, пока я не переберу все элементы массива, отжирается память. Хотелось бы ее освобождать как-то.
А сама схема такая: есть спрайт на слое под кнопками, я в этот спрайт с помощью addChild и removeChild подсовываю MovieClip'ы из массива (нажатии кнопок nextVideo и prevVideo).

КорДум 05.06.2010 13:26

Пока живы ссылки на объекты - они не будут подмяты GC. Поэтому нужно обnullить элементы массива.

ignition 05.06.2010 13:40

КорДум
Как так "обnullить"... :) Мне нужно подгрузить из массива MovieClip, проиграть его, сменить на другой MovieClip из массива, очистить память. Ну и т.д. Мне не нужно убивать массив. Мне не нравится что массив полностью в памяти висит, а не только тот MovieClip, что проигрывается в данный момент времени. Например, я запускаю первый элемент массива, в этот момент времени в памяти только он, и ему не нужны остальные элементы. Зачем мне при проигрывании второго элемента удерживать в памяти первый? Наверняка его можно как-то выгрузить...

Добавлено через 9 минут
[add]
И второй вопрос - почему при загрузке MovieClip'а памяти отжирается в десятки раз больше чем он весит? Видео из MovieClip'а весит 7 метров, а при подгрузке MovieClip'а отжирается около 200 метров. Если бы отжиралось 7 метров, я бы про память не спрашивал ;)

КорДум 05.06.2010 13:50

Обnullить вот так: arr[5] = null. Тогда ссылка на мувиклип пропадет, клип будет доступен сборке мусора. В вашей ситуации, когда нужно постоянно менять клипы и они не одноразовые, лучше каждый раз создавать новый экземпляр класса Mc1, Mc2, ..., McN, перед этим удалять все ссылки на клип предыдущий. Это как я бы сделал.
А, или сделать вот так:
Код AS3:

private var arr:Array = new Array(Mc1, Mc2, ..., McN);

Это лишь ссылки на классы клипов. А создавать объекты так:
Код AS3:

var mc1:MovieClip = new arr[0]; // создастся Mc1
removeChild(mc1);
mc1 = null;


ignition 07.06.2010 01:10

Так и не придумал, где (точнее как...) мне в такой схеме прикрутить null:
Код AS3:

var counter:int=-1;
var forward:Array=new Array(clip1_mc,clip2_mc,clip3_mc,clip4_mc,clip5_mc,clip6_mc);
stop();
.....
function goNext(event:MouseEvent) {
        if (video_container_mc.numChildren) {
                video_container_mc.removeChildAt(0);
                //Где-то здесь должен быть null
                <что-то>=null;
        };
        counter=(counter+1)%6;
        var cur_movie:MovieClip=new forward[counter];
        video_container_mc.addChild(cur_movie);
};
.....
next_btn.addEventListener(MouseEvent.CLICK, goNext);

Что должно быть вместо <что-то>?

КорДум 07.06.2010 01:43

Вам обнулять даже ничего не надо - переменная-ссылка на объект сама отмирает сразу же, как отработает метод. И опять повторюсь, что классы пишутся с большой буквы. Я вот сразу не понял, что находится у вас в массиве, пока не дочитал до конца.

ignition 07.06.2010 01:47

КорДум
Судя по тому, что мне показывает ProcessExplorer, память не возвращается, так и остается занятой. Пока я не переберу все клипы память отжирается. Как только я иду на второй круг, память больше не занимается.
А почему переменная-ссылка на объект должна обнулиться? Здесь?:
Код AS3:

var cur_movie:MovieClip=new forward[counter];


КорДум 07.06.2010 01:50

Сейчас я воспроизведу ситуацию и гляну через профайлер.

gloomyBrain 07.06.2010 01:55

Цитата:

почему переменная-ссылка на объект должна обнулиться? Здесь?:
Потому что к локальной переменной доступ прекращается в момент выхода из участка кода, где она упоминается. То есть если Вы объявляете переменную в теле функции, то только в этой функции эта переменная будет существовать. А раз так, значит по этой ссылке никак не получить доступ к мувиклипу. Значит про переменную можно забыть.
Если на мувиклип более нет никаких ссылок - значит к нему никак не обратиться - забываем про мувиклип.

ЗЫ
Если Вы смотрите через диспетчер задач - не верьте ему =)

КорДум 07.06.2010 01:58

В общем ясно. Объекты лежат в "корзине" и ждут, когда сборщик мусора решит, что эту корзину следует почистить. Грубо говоря, эти клипы не занимают много памяти, чтобы привлечь внимание сборщика мусора. Где-то здесь была тема про его работу.


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

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