Форум 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 07.06.2010 11:11

КорДум
А ссылка на один экземпляр только одна может быть? Отмирает перменная cur_movie, которая определена в функции, и отмирает ссылка вместе с ней. А какое отношение имеет спрайт к функции? Он же как был до выполнения функции, так и остался после. По идее спрайт, это как переменная, описаная вне функции. Точнее объект, в котором есть переменная (динамический массив или еще что-то типа того) для хранения ссылок на child'ов.
Я, кстати, вообще запутался как выделяется память в AS3... Почему, например, память выделяется не сразу под весь MovieClip, а во время его проигрывания, и для каждого кадра отдельно... Т.е. Я проигрываю MovieClip с последовательностью из 1000 jpeg'ов, так вот память отжирается все это время. В смысле, с каждым кадром свободной памяти становится все меньше.

КорДум 07.06.2010 11:45

Я не могу найти статью в инете, так что дам номер страницы в книге Мука "ActionScript 3.0 Подробное руководство". То, что вас так интересует, описано на странице 537. Там и про ссылки, и про обнуление, и про память.
Про вторую часть вашего поста ничего сказать не могу - я не сведущ в этом.

Добавлено через 12 минут
[IMG]http://s003.***********/i203/1006/96/457626f1719ft.jpg[/IMG]

ignition 07.06.2010 12:07

Спасибо. Прочитал.
И что здесь расходится с тем, что я написал? Ссылок на один объект, если верить тексту, может быть несколько. Одна из них (cur_movie) отмирает. А в video_container_mc ссылка есть. Или в объекте parent нет ссылки на child?

КорДум 07.06.2010 12:11

Как только срабатывает метод removeChild(), ссылка-индекс автоматически удаляется из списка отображения контейнера. Там в конце написано, что после удаления клип может продолжать проигрываться. Также могут срабатывать оставшиеся события. У вас есть такое?

ignition 07.06.2010 12:19

Может продолжать проигрыватся. Я же писал, что в последнем фрейме MovieClip'ов у меня stop() стоит.

КорДум 07.06.2010 12:25

Я иссяк. Остается надеяться на ответы гуру.

ignition 08.06.2010 00:09

Ок. Есть предложение отвлечься от теории... ;) и решить одну проблему - как мне получить доступ к ссылке в моей схеме? В момент, когда я делаю:
Код AS3:

video_container_mc.removeChildAt(0);

имени объекта (точнее имени экземпляра) уже нет, обратиться к нему по имени уже не получится. Нужно как-то выходить на ссылку через video_container_mc. Как это делается?

gloomyBrain 08.06.2010 00:50

Цитата:

Нужно как-то выходить на ссылку через video_container_mc. Как это делается?
Код AS3:

var mc:MovieClip = video_container_mc.getChildAt(глубина) as MovieClip;

По поводу умирания ссылок и тд - если объект находится в дисплей-листе (то есть добавлен на сцену), то мы можем к нему обратиться - только что написал как это можно сделать. А раз к нему можно обратиться, то из памяти он никуда не денется.

ignition 08.06.2010 01:00

gloomyBrain
Т.е. так? :
Код 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) {
                var mc_for_kill:MovieClip = video_container_mc.getChildAt(0) as MovieClip;
                video_container_mc.removeChildAt(0);
                mc_for_kill=null;
        };
        counter=(counter+1)%6;
        var cur_movie:MovieClip=new forward[counter];
        video_container_mc.addChild(cur_movie);
};
.....
next_btn.addEventListener(MouseEvent.CLICK, goNext);

Добавлено через 6 минут
Проверил. Обратиться можем, ошибок не вылезает... т.е. можно сделать вывод, что память не освободилась. Так?
Кстати, а в AS3 есть какие-то средства контроля памяти? Есть какая-то ф-ция выводящая инфу?
По идее, если бы не было ссылки, то уже здесь:
Код AS3:

video_container_mc.removeChildAt(0);

вылезла бы ошибка

PS Изменение кода ни как не повлияло на проблемы с памятью. Она все равно забита.

gloomyBrain 08.06.2010 01:37

Цитата:

Проверил. Обратиться можем, ошибок не вылезает... т.е. можно сделать вывод, что память не освободилась. Так?
Да, именно так


Цитата:

Есть какая-то ф-ция выводящая инфу?
System.totalMemory

Цитата:

вылезла бы ошибка
Откуда быть ошибке?
К объекту можно обратиться как через clip1_mc, так и через getChildAt(0) - это ссылки на один и тот же объект.
Объект станет доступным для "поедания" gc только после выполнения
Код AS3:

clip1_mc = null;
removeChildAt(0);

ЗЫ
кстати, после removeChildAt(0) пустых глубин не остается, то есть все объекты в контейнере "упадут" на одну позицию. Теперь на нулевом индексе будет сидеть объект, который раньше был на 1-м


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

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