![]() |
|
||||||||||
|
|||||
|
Регистрация: Jul 2007
Адрес: Москва
Сообщений: 996
|
Давно интересовал вопрос чистки памяти. Вот решил до конца разобраться раз и навсегда, надеюсь на Ваше содействие в этом вопросе.
С BitmapData все понятно, память прекрасно освобождается, проблем не возникает. Но обычно библиотечные символы, даже если включают в себя Bitmap, все равно - это Shape. Вот тут непонятно, каким образом заставить gc очистить память. Провел небольшой тест. Сначала создаю много объектов: 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); } Затем удаляю: var i:int = numChildren; var sprite:Sprite; while (i--) { sprite = getChildAt(i) as Sprite; sprite.graphics.clear(); removeChild(sprite); } Вот, интересно, почему очищается только небольшая часть памяти и каким образом очистить остальную?
__________________
Griver Последний раз редактировалось mre; 06.02.2009 в 16:01. |
|
|||||
|
Никаким. Это мифический GC должен делать.
Я вот похожие вопросы задавал: http://www.flasher.ru/forum/showthre...hlight=garbage http://www.flasher.ru/forum/showthre...EE%F0%F9%E8%EA |
|
|||||
|
Регистрация: Sep 2008
Адрес: Москва
Сообщений: 224
|
Никак, провёл этот же тест с использование профайлера флексового:
При создании спрайтов 8 мб памяти занято ![]() После удаления также 8 мб(gc не запустился). Потом профайлером запускаю GC и получаю полное очищение оперативы. Вердикт - чтоб очистить оперативу, мы можем только сходить покурить в надежде что память очистится за это время ![]() |
|
|||||
|
Негуру
администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
|
Ну так еще 2/3 есть
![]() Добавлено через 7 минут 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 (); } Цитата:
Раскомментарем три строки, где происходит насильный вызов GC Цитата:
|
![]() |
![]() |
Часовой пояс GMT +4, время: 03:27. |
|
|
« Предыдущая тема | Следующая тема » |
|
|