![]() |
Как очистить память при работе с массивом MovieClip'ов?
Как очистить память при работе с массивом MovieClip'ов? Что нужно сделать, чтобы при подгрузке очередного MovieClip'а предыдущий выгружался из памяти? Сейчас, пока я не переберу все элементы массива, отжирается память. Хотелось бы ее освобождать как-то.
А сама схема такая: есть спрайт на слое под кнопками, я в этот спрайт с помощью addChild и removeChild подсовываю MovieClip'ы из массива (нажатии кнопок nextVideo и prevVideo). |
Пока живы ссылки на объекты - они не будут подмяты GC. Поэтому нужно обnullить элементы массива.
|
КорДум
Как так "обnullить"... :) Мне нужно подгрузить из массива MovieClip, проиграть его, сменить на другой MovieClip из массива, очистить память. Ну и т.д. Мне не нужно убивать массив. Мне не нравится что массив полностью в памяти висит, а не только тот MovieClip, что проигрывается в данный момент времени. Например, я запускаю первый элемент массива, в этот момент времени в памяти только он, и ему не нужны остальные элементы. Зачем мне при проигрывании второго элемента удерживать в памяти первый? Наверняка его можно как-то выгрузить... Добавлено через 9 минут [add] И второй вопрос - почему при загрузке MovieClip'а памяти отжирается в десятки раз больше чем он весит? Видео из MovieClip'а весит 7 метров, а при подгрузке MovieClip'а отжирается около 200 метров. Если бы отжиралось 7 метров, я бы про память не спрашивал ;) |
Обnullить вот так: arr[5] = null. Тогда ссылка на мувиклип пропадет, клип будет доступен сборке мусора. В вашей ситуации, когда нужно постоянно менять клипы и они не одноразовые, лучше каждый раз создавать новый экземпляр класса Mc1, Mc2, ..., McN, перед этим удалять все ссылки на клип предыдущий. Это как я бы сделал.
А, или сделать вот так: Код AS3:
Код AS3:
|
Так и не придумал, где (точнее как...) мне в такой схеме прикрутить null:
Код AS3:
|
Вам обнулять даже ничего не надо - переменная-ссылка на объект сама отмирает сразу же, как отработает метод. И опять повторюсь, что классы пишутся с большой буквы. Я вот сразу не понял, что находится у вас в массиве, пока не дочитал до конца.
|
КорДум
Судя по тому, что мне показывает ProcessExplorer, память не возвращается, так и остается занятой. Пока я не переберу все клипы память отжирается. Как только я иду на второй круг, память больше не занимается. А почему переменная-ссылка на объект должна обнулиться? Здесь?: Код AS3:
|
Сейчас я воспроизведу ситуацию и гляну через профайлер.
|
Цитата:
Если на мувиклип более нет никаких ссылок - значит к нему никак не обратиться - забываем про мувиклип. ЗЫ Если Вы смотрите через диспетчер задач - не верьте ему =) |
В общем ясно. Объекты лежат в "корзине" и ждут, когда сборщик мусора решит, что эту корзину следует почистить. Грубо говоря, эти клипы не занимают много памяти, чтобы привлечь внимание сборщика мусора. Где-то здесь была тема про его работу.
|
gloomyBrain
Если обнуляется переменная (а эта переменная по идее экземпляр объекта), то почему тогда MovieClip остается видимым? У меня в последнем фрейме MovieClip'a stop(); стоит. Видео останавливается и никуда не девается... |
Одно дело сам объект, другое - ссылка на него. Вот та переменная - ссылка.
|
КорДум: "эти клипы не занимают много памяти"
Каждый клип отжирает около 200 метров памяти. Я бы не сказал, что это "немного"... Про память я уже здесь спросил: http://www.flasher.ru/forum/showthread.php?t=140741 |
Ну нифига себе! Может вам попробовать вручную запускать ГЦ через класс Silin'а? http://www.silin.su/#AS3/utils/gc
По коду ясно видно, что никаких ссылок на клипы не остается, а значит ГЦ обязан сработать. Тем более при таком объеме отжираемой памяти. |
Дык... Я вообще не втыкаю, как так. По ссылке из предыдущей мессаги подробнее.
|
А что подробнее? Качаем класс, подключаем, в нужный момент, то есть после удаления клипа, вызываем метод из класса.
|
|
А, не увидел.
|
Все же, что остается висеть под спрайтом...? :) Я создаю экземпляр, выделяю память, подсовываю его под спрайт. Почему этот самый экземпляр виден, если ссылка на него при выходе из процедуры дохнет. Я так понимаю, что при addChild ссылка на мой экземпляр передается спрайту. Вот он эту ссылку и удерживает. Получается, что нужно сделать removeChild и обнулить ссылку. Вот только как это сделать? Я про обнуление в своем примере кода.
|
gloomyBrain и я правы, верьте нам. Ссылка отмирает сразу же, нет ее.
|
КорДум
А ссылка на один экземпляр только одна может быть? Отмирает перменная cur_movie, которая определена в функции, и отмирает ссылка вместе с ней. А какое отношение имеет спрайт к функции? Он же как был до выполнения функции, так и остался после. По идее спрайт, это как переменная, описаная вне функции. Точнее объект, в котором есть переменная (динамический массив или еще что-то типа того) для хранения ссылок на child'ов. Я, кстати, вообще запутался как выделяется память в AS3... Почему, например, память выделяется не сразу под весь MovieClip, а во время его проигрывания, и для каждого кадра отдельно... Т.е. Я проигрываю MovieClip с последовательностью из 1000 jpeg'ов, так вот память отжирается все это время. В смысле, с каждым кадром свободной памяти становится все меньше. |
Я не могу найти статью в инете, так что дам номер страницы в книге Мука "ActionScript 3.0 Подробное руководство". То, что вас так интересует, описано на странице 537. Там и про ссылки, и про обнуление, и про память.
Про вторую часть вашего поста ничего сказать не могу - я не сведущ в этом. Добавлено через 12 минут [IMG]http://s003.***********/i203/1006/96/457626f1719ft.jpg[/IMG] |
Спасибо. Прочитал.
И что здесь расходится с тем, что я написал? Ссылок на один объект, если верить тексту, может быть несколько. Одна из них (cur_movie) отмирает. А в video_container_mc ссылка есть. Или в объекте parent нет ссылки на child? |
Как только срабатывает метод removeChild(), ссылка-индекс автоматически удаляется из списка отображения контейнера. Там в конце написано, что после удаления клип может продолжать проигрываться. Также могут срабатывать оставшиеся события. У вас есть такое?
|
Может продолжать проигрыватся. Я же писал, что в последнем фрейме MovieClip'ов у меня stop() стоит.
|
Я иссяк. Остается надеяться на ответы гуру.
|
Ок. Есть предложение отвлечься от теории... ;) и решить одну проблему - как мне получить доступ к ссылке в моей схеме? В момент, когда я делаю:
Код AS3:
|
Цитата:
Код AS3:
|
gloomyBrain
Т.е. так? : Код AS3:
Проверил. Обратиться можем, ошибок не вылезает... т.е. можно сделать вывод, что память не освободилась. Так? Кстати, а в AS3 есть какие-то средства контроля памяти? Есть какая-то ф-ция выводящая инфу? По идее, если бы не было ссылки, то уже здесь: Код AS3:
PS Изменение кода ни как не повлияло на проблемы с памятью. Она все равно забита. |
Цитата:
Цитата:
Цитата:
К объекту можно обратиться как через clip1_mc, так и через getChildAt(0) - это ссылки на один и тот же объект. Объект станет доступным для "поедания" gc только после выполнения Код AS3:
кстати, после removeChildAt(0) пустых глубин не остается, то есть все объекты в контейнере "упадут" на одну позицию. Теперь на нулевом индексе будет сидеть объект, который раньше был на 1-м |
Я до и после:
Код AS3:
Код AS3:
1 0 |
| Часовой пояс GMT +4, время: 18:58. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.