Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   удаление объекта из памяти (http://www.flasher.ru/forum/showthread.php?t=153764)

Monade 2 08.04.2011 16:00

удаление объекта из памяти
 
здравствуйте! есть такая проблема, при создании большого кол-ва объектов (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 сделан специально для отслеживания памяти. или я просто не туда смотрю и не то делаю?

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

Zebestov 08.04.2011 16:11

BitmapData#dispose()

Monade 2 08.04.2011 16:13

спаибо, но здесь bitmapData просто как пример. а если там объект MovieClip вместо bitmapData ?

Zebestov 08.04.2011 16:18

Тогда память будет расти до очередного обхода доктора GC.
И да — DisplayObject-ы не забываем к тому же удалять из списка отображения.

DaFive 08.04.2011 16:20

Отписать от всех событий, занулить ссылки, удалить.

Monade 2 08.04.2011 16:20

это само собой, 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)

in4core 08.04.2011 18:30

Цитата:

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

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

Monade 2 08.04.2011 18:34

Цитата:

Сообщение от in4core (Сообщение 987742)
Сначала снять события со всех внутренних объектов, затем события с контейнера, ремовить внутренности, затем занулить, затем занулить и заремувить контейнер )) жутко, а как вы хотели...

ну вот к примеру у меня есть текстовое поле TLF. динамически созданное. removeChild запускаю, потом в null, однако память все равно не освобождается. со статическими полями вообще не понятно как работать. что ж такое

dimarik 08.04.2011 18:58

Наверняка загруженная флешка на stage подписана.

Monade 2 08.04.2011 19:15

Цитата:

Сообщение от Monade 2 (Сообщение 987745)
ну вот к примеру у меня есть текстовое поле TLF. динамически созданное. removeChild запускаю, потом в null, однако память все равно не освобождается. со статическими полями вообще не понятно как работать. что ж такое

нашел способ для текстовых полей, нужно сначала весь текст оттуда убрать :)

dimarik 08.04.2011 19:45

Значит, в том, что удаляется остаются ссылки на то, что не подлежит удалению.


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

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