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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 08.04.2011, 16:00
Monade 2 вне форума Посмотреть профиль Отправить личное сообщение для Monade 2 Найти все сообщения от Monade 2
  № 1  
Ответить с цитированием
Monade 2
 
Аватар для Monade 2

Регистрация: Apr 2011
Сообщений: 38
По умолчанию удаление объекта из памяти

здравствуйте! есть такая проблема, при создании большого кол-ва объектов (bitmapData к примеру), сильно приложение начинает тормозить (делаем игру). перелопатил много материала на иностранных форумах, где было сказано, что чтобы удалить из памяти какой-либо объект, нужно убрать все references на него (ссылки, наверное), то есть листенеры, и т.д. однако даже такой пример не работает как надо:

Код AS3:
import flash.display.Bitmap;
import flash.display.BitmapData;
 
var myShapeB:BitmapData;
b.addEventListener(MouseEvent.CLICK, fn_add);
c.addEventListener(MouseEvent.CLICK, fn_remove);
 
function fn_add(e:Event)
{
	myShapeB = new BitmapData(2000,2000,true,0xFFDD0000);
 
	b.removeEventListener(MouseEvent.CLICK, fn);
 
}
 
function fn_remove(e:Event)
{
	myShapeB = null;
 
	c.removeEventListener(MouseEvent.CLICK, fn2);
 
}
при множественном нажатии кнопок (сначала fn_add, потом fn_remove) выделяемая память растет ну совсем уж неприлично. большой размер 2000 на 2000 сделан специально для отслеживания памяти. или я просто не туда смотрю и не то делаю?

заранее спасибо!

Старый 08.04.2011, 16:11
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 2  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
BitmapData#dispose()
__________________
Поймай яблоко 2!


Последний раз редактировалось Zebestov; 08.04.2011 в 16:18.
Старый 08.04.2011, 16:13
Monade 2 вне форума Посмотреть профиль Отправить личное сообщение для Monade 2 Найти все сообщения от Monade 2
  № 3  
Ответить с цитированием
Monade 2
 
Аватар для Monade 2

Регистрация: Apr 2011
Сообщений: 38
спаибо, но здесь bitmapData просто как пример. а если там объект MovieClip вместо bitmapData ?

Старый 08.04.2011, 16:18
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 4  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Тогда память будет расти до очередного обхода доктора GC.
И да — DisplayObject-ы не забываем к тому же удалять из списка отображения.
__________________
Поймай яблоко 2!

Старый 08.04.2011, 16:20
DaFive вне форума Посмотреть профиль Отправить личное сообщение для DaFive Посетить домашнюю страницу DaFive Найти все сообщения от DaFive
  № 5  
Ответить с цитированием
DaFive
 
Аватар для DaFive

Регистрация: May 2008
Адрес: {0,0}
Сообщений: 754
Записей в блоге: 1
Отправить сообщение для DaFive с помощью ICQ
Отписать от всех событий, занулить ссылки, удалить.
__________________
Кодинг, багинг, алгоритминг. me @

Старый 08.04.2011, 16:20
Monade 2 вне форума Посмотреть профиль Отправить личное сообщение для Monade 2 Найти все сообщения от Monade 2
  № 6  
Ответить с цитированием
Monade 2
 
Аватар для Monade 2

Регистрация: Apr 2011
Сообщений: 38
это само собой, removeChild используем. а с какой примерно периодичностью запускается GC?

и еще пример - если в MovieClip куча всякого понапихано, например кнопки, поля TLF, опять же Bitmap, их как-то по отдельности нужно обрабатывать?

Добавлено через 1 час 57 минут
интересное наблюдение. есть код:

Код AS3:
addEventListener(Event.ENTER_FRAME, function(){ trace(System.totalMemory);  } );
 
var container = new MovieClip;
addChild(container );
 
var lHome:Loader = new Loader();
var urlrHome:URLRequest = new URLRequest("test2.swf");
 
function c_load (e:Event){
	lHome.load(urlrHome);
	lHome.contentLoaderInfo.addEventListener(Event.COMPLETE, movieLoaded);
}
 
function movieLoaded(event:Event):void {
	container.addChild(lHome);
	lHome.contentLoaderInfo.removeEventListener(Event.COMPLETE, movieLoaded);
}
 
function c_unload(e:Event){
 
	lHome.unloadAndStop(false);
	container.removeChild(lHome);
	lHome = null;
	container = null;
 
	try {
		new LocalConnection().connect('foo');
		new LocalConnection().connect('foo');
	} catch (e:*) {}
}
в тестовом ролике есть несколько больших картинок BitmapData. Код:

Код AS3:
try {
	new LocalConnection().connect('foo');
	new LocalConnection().connect('foo');
} catch (e:*) {}
принудительный вызов GC (вроде как). так вот, если в тестовом ролике находятся только BitmapData, память успешно освобождается после вызова функции c_unload. если же там есть хотя бы одна кнопка или хотя бы одно динамическое текстовое поле, этого не происходит (память не освобождается). кто-нибудь сталкивался с этим, и если да, то как можно решить проблему?

заранее спасибо!

Добавлено через 2 часа 0 минут
смена false на true в unloadAndStop ничего не меняет (хотя по умолчанию true)

Старый 08.04.2011, 18:30
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 7  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
Цитата:
и еще пример - если в MovieClip куча всякого понапихано, например кнопки, поля TLF, опять же Bitmap, их как-то по отдельности нужно обрабатывать?
Сначала снять события со всех внутренних объектов, затем события с контейнера, ремовить внутренности, затем занулить, затем занулить и заремувить контейнер )) жутко, а как вы хотели...

Добавлено через 1 минуту
lHome.unloadAndStop(false); // с параметром тру, идет запуск GC)

Старый 08.04.2011, 18:34
Monade 2 вне форума Посмотреть профиль Отправить личное сообщение для Monade 2 Найти все сообщения от Monade 2
  № 8  
Ответить с цитированием
Monade 2
 
Аватар для Monade 2

Регистрация: Apr 2011
Сообщений: 38
Цитата:
Сообщение от in4core Посмотреть сообщение
Сначала снять события со всех внутренних объектов, затем события с контейнера, ремовить внутренности, затем занулить, затем занулить и заремувить контейнер )) жутко, а как вы хотели...
ну вот к примеру у меня есть текстовое поле TLF. динамически созданное. removeChild запускаю, потом в null, однако память все равно не освобождается. со статическими полями вообще не понятно как работать. что ж такое

Старый 08.04.2011, 18:58
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 9  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Наверняка загруженная флешка на stage подписана.
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Старый 08.04.2011, 19:15
Monade 2 вне форума Посмотреть профиль Отправить личное сообщение для Monade 2 Найти все сообщения от Monade 2
  № 10  
Ответить с цитированием
Monade 2
 
Аватар для Monade 2

Регистрация: Apr 2011
Сообщений: 38
Цитата:
Сообщение от Monade 2 Посмотреть сообщение
ну вот к примеру у меня есть текстовое поле TLF. динамически созданное. removeChild запускаю, потом в null, однако память все равно не освобождается. со статическими полями вообще не понятно как работать. что ж такое
нашел способ для текстовых полей, нужно сначала весь текст оттуда убрать

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

Теги
bitmapdata , gc , memory leak

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

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


 


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


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