Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 05.06.2010, 11:58
ignition вне форума Посмотреть профиль Отправить личное сообщение для ignition Найти все сообщения от ignition
  № 1  
Ответить с цитированием
ignition

Регистрация: Jun 2010
Сообщений: 37
По умолчанию Как очистить память при работе с массивом MovieClip'ов?

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

Старый 05.06.2010, 13:26
КорДум вне форума Посмотреть профиль Отправить личное сообщение для КорДум Найти все сообщения от КорДум
  № 2  
Ответить с цитированием
КорДум
 
Аватар для КорДум

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
Пока живы ссылки на объекты - они не будут подмяты GC. Поэтому нужно обnullить элементы массива.
__________________
тут я

Старый 05.06.2010, 13:40
ignition вне форума Посмотреть профиль Отправить личное сообщение для ignition Найти все сообщения от ignition
  № 3  
Ответить с цитированием
ignition

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

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


Последний раз редактировалось ignition; 05.06.2010 в 13:51.
Старый 05.06.2010, 13:50
КорДум вне форума Посмотреть профиль Отправить личное сообщение для КорДум Найти все сообщения от КорДум
  № 4  
Ответить с цитированием
КорДум
 
Аватар для КорДум

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
Об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;
__________________
тут я

Старый 07.06.2010, 01:10
ignition вне форума Посмотреть профиль Отправить личное сообщение для ignition Найти все сообщения от ignition
  № 5  
Ответить с цитированием
ignition

Регистрация: Jun 2010
Сообщений: 37
Так и не придумал, где (точнее как...) мне в такой схеме прикрутить 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);
Что должно быть вместо <что-то>?


Последний раз редактировалось ignition; 07.06.2010 в 01:25.
Старый 07.06.2010, 01:43
КорДум вне форума Посмотреть профиль Отправить личное сообщение для КорДум Найти все сообщения от КорДум
  № 6  
Ответить с цитированием
КорДум
 
Аватар для КорДум

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
Вам обнулять даже ничего не надо - переменная-ссылка на объект сама отмирает сразу же, как отработает метод. И опять повторюсь, что классы пишутся с большой буквы. Я вот сразу не понял, что находится у вас в массиве, пока не дочитал до конца.
__________________
тут я

Старый 07.06.2010, 01:47
ignition вне форума Посмотреть профиль Отправить личное сообщение для ignition Найти все сообщения от ignition
  № 7  
Ответить с цитированием
ignition

Регистрация: Jun 2010
Сообщений: 37
КорДум
Судя по тому, что мне показывает ProcessExplorer, память не возвращается, так и остается занятой. Пока я не переберу все клипы память отжирается. Как только я иду на второй круг, память больше не занимается.
А почему переменная-ссылка на объект должна обнулиться? Здесь?:
Код AS3:
var cur_movie:MovieClip=new forward[counter];

Старый 07.06.2010, 01:50
КорДум вне форума Посмотреть профиль Отправить личное сообщение для КорДум Найти все сообщения от КорДум
  № 8  
Ответить с цитированием
КорДум
 
Аватар для КорДум

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
Сейчас я воспроизведу ситуацию и гляну через профайлер.
__________________
тут я

Старый 07.06.2010, 01:55
gloomyBrain вне форума Посмотреть профиль Отправить личное сообщение для gloomyBrain Найти все сообщения от gloomyBrain
  № 9  
Ответить с цитированием
gloomyBrain
 
Аватар для gloomyBrain

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
Цитата:
почему переменная-ссылка на объект должна обнулиться? Здесь?:
Потому что к локальной переменной доступ прекращается в момент выхода из участка кода, где она упоминается. То есть если Вы объявляете переменную в теле функции, то только в этой функции эта переменная будет существовать. А раз так, значит по этой ссылке никак не получить доступ к мувиклипу. Значит про переменную можно забыть.
Если на мувиклип более нет никаких ссылок - значит к нему никак не обратиться - забываем про мувиклип.

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

Старый 07.06.2010, 01:58
КорДум вне форума Посмотреть профиль Отправить личное сообщение для КорДум Найти все сообщения от КорДум
  № 10  
Ответить с цитированием
КорДум
 
Аватар для КорДум

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
В общем ясно. Объекты лежат в "корзине" и ждут, когда сборщик мусора решит, что эту корзину следует почистить. Грубо говоря, эти клипы не занимают много памяти, чтобы привлечь внимание сборщика мусора. Где-то здесь была тема про его работу.
__________________
тут я

Создать новую тему Ответ Часовой пояс GMT +4, время: 17:48.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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