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

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

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

Регистрация: Jul 2007
Адрес: Москва
Сообщений: 996
По умолчанию Чистим память от Graphics

Давно интересовал вопрос чистки памяти. Вот решил до конца разобраться раз и навсегда, надеюсь на Ваше содействие в этом вопросе.

С BitmapData все понятно, память прекрасно освобождается, проблем не возникает.
Но обычно библиотечные символы, даже если включают в себя Bitmap, все равно - это Shape.
Вот тут непонятно, каким образом заставить gc очистить память.
Провел небольшой тест.
Сначала создаю много объектов:
Код AS3:
var sprite:Sprite;
for (var i:int = 0; i < 20000; i++)
{
	sprite = new Sprite();
	sprite.graphics.beginFill(0xFF0000);
	sprite.graphics.drawRect(0, 0, 500, 500);
	sprite.graphics.endFill();
	addChild(sprite);
}
После этого, памяти - 80 Мб.
Затем удаляю:
Код AS3:
var i:int = numChildren;
var sprite:Sprite;
while (i--)
{
	sprite = getChildAt(i) as Sprite;
	sprite.graphics.clear();
	removeChild(sprite);
}
После удаления, памяти - 65 Мб.

Вот, интересно, почему очищается только небольшая часть памяти и каким образом очистить остальную?
__________________
Griver


Последний раз редактировалось mre; 06.02.2009 в 16:01.
Старый 06.02.2009, 16:24
Волгоградец вне форума Посмотреть профиль Отправить личное сообщение для Волгоградец Найти все сообщения от Волгоградец
  № 2  
Ответить с цитированием
Волгоградец
 
Аватар для Волгоградец

блогер
Регистрация: Sep 2007
Адрес: Гамбург
Сообщений: 1,648
Записей в блоге: 12
Никаким. Это мифический GC должен делать.
Я вот похожие вопросы задавал:
http://www.flasher.ru/forum/showthre...hlight=garbage
http://www.flasher.ru/forum/showthre...EE%F0%F9%E8%EA

Старый 06.02.2009, 16:30
r_r_f_r вне форума Посмотреть профиль Отправить личное сообщение для r_r_f_r Найти все сообщения от r_r_f_r
  № 3  
Ответить с цитированием
r_r_f_r

Регистрация: Sep 2008
Адрес: Москва
Сообщений: 224
Никак, провёл этот же тест с использование профайлера флексового:
При создании спрайтов 8 мб памяти занято
После удаления также 8 мб(gc не запустился).
Потом профайлером запускаю GC и получаю полное очищение оперативы.

Вердикт - чтоб очистить оперативу, мы можем только сходить покурить в надежде что память очистится за это время

Старый 06.02.2009, 16:43
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 4  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
GC вызывается при достижении порога свободной памяти.
А сейчас вы лишь подготовили почву для очистки памяти.
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Старый 06.02.2009, 16:57
Волгоградец вне форума Посмотреть профиль Отправить личное сообщение для Волгоградец Найти все сообщения от Волгоградец
  № 5  
Ответить с цитированием
Волгоградец
 
Аватар для Волгоградец

блогер
Регистрация: Sep 2007
Адрес: Гамбург
Сообщений: 1,648
Записей в блоге: 12
Цитата:
Сообщение от iNils Посмотреть сообщение
GC вызывается при достижении порога свободной памяти.
Интересно, каков порог в цифрах? У меня при 1/3 занятой памяти не срабатывает .

Старый 06.02.2009, 16:59
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 6  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
Ну так еще 2/3 есть

Добавлено через 7 минут
Код AS3:
import flash.net.LocalConnection;
function fill ():void {
	trace ("fill");
	trace ("1: " + System.totalMemory);
	var sprite:Sprite;
	for (var i:int = 0; i < 20000; i++) {
		sprite = new Sprite();
		sprite.graphics.beginFill (0xFF0000);
		sprite.graphics.drawRect (0, 0, 500, 500);
		sprite.graphics.endFill ();
		addChild (sprite);
	}
	trace ("2: " + System.totalMemory);
}
function clear ():void {
	trace ("clear");
	trace ("1: " + System.totalMemory);
	var i:int = numChildren;
	var sprite:Sprite;
	while (i--) {
		sprite = getChildAt(i) as Sprite;
		sprite.graphics.clear ();
		removeChild (sprite);
		sprite = null;
	}
	trace ("2: " + System.totalMemory);
	try {
		//(new LocalConnection).connect ('gc');
		//(new LocalConnection).connect ('gc');
	} catch (e:*) {
	}
	//trace ("3: " + System.totalMemory);
}
stage.addEventListener (MouseEvent.MOUSE_DOWN, onDown);
var flag:Boolean = false;
function onDown (event:MouseEvent) {
	if (flag) {
		clear ();
	} else {
		fill ();
	}
	flag = !flag;
	trace ();
}
Результат двух пар кликов
Цитата:
fill
1: 2179072
2: 62316544

clear
1: 67145728
2: 20455424

fill
1: 20447232
2: 62472192

clear
1: 67301376
2: 21082112
Память очищается, но не до начального уровня.
Раскомментарем три строки, где происходит насильный вызов GC
Цитата:
fill
1: 2183168
2: 62271488

clear
1: 67100672
2: 20459520
3: 3080192

fill
1: 3072000
2: 62345216

clear
1: 67174400
2: 21745664
3: 3092480
После вызова GC память отчищается фактически до того состояния как и было.
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Старый 06.02.2009, 17:20
Волгоградец вне форума Посмотреть профиль Отправить личное сообщение для Волгоградец Найти все сообщения от Волгоградец
  № 7  
Ответить с цитированием
Волгоградец
 
Аватар для Волгоградец

блогер
Регистрация: Sep 2007
Адрес: Гамбург
Сообщений: 1,648
Записей в блоге: 12
Код AS3:
fill
1: 3112960
2: 59269120
 
clear
1: 64270336
2: 59691008
Твой код, iNils - это без хака с LocalConnection.

Старый 06.02.2009, 17:26
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 8  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
Я в Flash IDE это тестировал, лень было в FD проект закрывать.
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Старый 06.02.2009, 17:33
Волгоградец вне форума Посмотреть профиль Отправить личное сообщение для Волгоградец Найти все сообщения от Волгоградец
  № 9  
Ответить с цитированием
Волгоградец
 
Аватар для Волгоградец

блогер
Регистрация: Sep 2007
Адрес: Гамбург
Сообщений: 1,648
Записей в блоге: 12
А что, есть разница? Я в FD тестировал.

Старый 06.02.2009, 18:01
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 10  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
Запросто.
__________________
(и)Нильс.ru | Плагины для FlashDevelop

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

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

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


 


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


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