Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Чистим память от Graphics (http://www.flasher.ru/forum/showthread.php?t=121063)

mre 06.02.2009 15:57

Чистим память от 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 Мб.

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

Волгоградец 06.02.2009 16:24

Никаким. Это мифический GC должен делать.
Я вот похожие вопросы задавал:
http://www.flasher.ru/forum/showthre...hlight=garbage
http://www.flasher.ru/forum/showthre...EE%F0%F9%E8%EA

r_r_f_r 06.02.2009 16:30

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

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

iNils 06.02.2009 16:43

GC вызывается при достижении порога свободной памяти.
А сейчас вы лишь подготовили почву для очистки памяти.

Волгоградец 06.02.2009 16:57

Цитата:

Сообщение от iNils (Сообщение 796152)
GC вызывается при достижении порога свободной памяти.

Интересно, каков порог в цифрах? У меня при 1/3 занятой памяти не срабатывает :rtfm:.

iNils 06.02.2009 16:59

Ну так еще 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 память отчищается фактически до того состояния как и было.

Волгоградец 06.02.2009 17:20

Код AS3:

fill
1: 3112960
2: 59269120
 
clear
1: 64270336
2: 59691008

Твой код, iNils - это без хака с LocalConnection.

iNils 06.02.2009 17:26

Я в Flash IDE это тестировал, лень было в FD проект закрывать.

Волгоградец 06.02.2009 17:33

А что, есть разница? Я в FD тестировал.

iNils 06.02.2009 18:01

Запросто.


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

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