Цитата:
Сообщение от mickfallout
в любом месте любого класса Вы можете получить нужную битмапу в любое время(естественно после загрузки):
 Код AS3:
var bitmap:Bitmap= Main.getBitmap("Название_битмапы")
|
У вас по getBitmap - создаётся новая битмпдата.
на Вашем месте я бы при первом вызове помещал битмапдаты в словарь и при последующих вызовах возвращал бы ссылку на неё.
Если нужно удаление - в словаре храните счётчик, который инкрементируется при создании битмапы - уменьшается при удалении. в 0 - вызываем dispose.
такой подход позволяет существенно сократить расходы памяти если используется большое количество одинаковых битмапдат.
У меня есть где-то класс менеджера ресурсов работающий по этому принципу. Найду-выложу.
что-то вроде собственного Сборщика Мусора.

Код AS3:
package ru.k0t0vich
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.utils.Dictionary;
/**
* Менеджер битмап
* @author k0t0vich
*/
public class BitmapManager
{
static private var bmpdDict:Dictionary = new Dictionary();/*BitmapData,Object*/
static private var bmpdList:Object = {};
static public function getBitmap(bitmapdataName:String, resourcesLoader:Loader ):Bitmap
{
var bitmap:Bitmap;
var bitmapData:BitmapData;
// {bitmapData,counter,name}
var obj:Object;
// находим битмапдату в хэш списке
// можно было обойтись только словарём, но тогда-бы пришлось обходить
//словарь и выискивать объект по name, что медленнее.
bitmapData = bmpdList[bmpdName];
if (bitmapData)
{
obj = bmpdDict[bitmapData];
obj.counter++;
}
else
{
//достаем из лоадера определение класса нужной битмапдаты
var bitmapDatasClass:Class = resourcesLoader.content.loaderInfo.applicationDomain.getDefinition(bitmapdataName) as Class;
//создаем экземпляр битмапдаты
bitmapData = BitmapData(new bitmapDatasClass(0, 0));
// сохраняем в словаре
obj = { bitmapData:bitmapData, counter:1, name:bitmapdataName };
bmpdDict[bitmapData] = obj;
// сохраняем в хэш списке
bmpdList[bmpdName] = bitmapData;
}
//создаем битмапу с нужной битмапдатой
var bitmap = new Bitmap(bitmapData);
return bitmap;
}
static private function disposeBitmap(bitmap:Bitmap):void
{
var bitmapData:BitmapData = bitmap.bitmapData;
var obj:Object = bmpdDict[bitmapData];
obj.counter--;
if (obj.counter <= 0)
{
delete bmpdDict[bitmapData];
delete bmpdList[obj.name];
bitmapData.dispose();
}
}
}
}
Для эмуляции GC можно не проверять по счётчику (мало ли - забыли вызвать disposeBitmap перед удалением Bitmap), а сохранять битмапы в списке, например в obj {bitmapList} - при вызове очистки проходить по списку битмапов и если все они == null диспозить битмапу и очищать списки..
в какой момент вызывать очистку в кастомном коллекторе - тоже вопрос... Можно наверное как-то следить за использованной памятью и на превышении некоего предела вызывать очистку. Тут главное не зациклить
т.к. очистка может ничего не высвободить, а критерий вызова останется.. Например вызывать проверку по таймеру.