Показать сообщение отдельно
Старый 12.04.2010, 09:55
Котяра вне форума Посмотреть профиль Отправить личное сообщение для Котяра Посетить домашнюю страницу Котяра Найти все сообщения от Котяра
  № 7  
Ответить с цитированием
Котяра
буду краток
 
Аватар для Котяра

модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
Отправить сообщение для Котяра с помощью ICQ Отправить сообщение для Котяра с помощью Skype™
Цитата:
Сообщение от 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 диспозить битмапу и очищать списки..
в какой момент вызывать очистку в кастомном коллекторе - тоже вопрос... Можно наверное как-то следить за использованной памятью и на превышении некоего предела вызывать очистку. Тут главное не зациклить
т.к. очистка может ничего не высвободить, а критерий вызова останется.. Например вызывать проверку по таймеру.
__________________
Отряд Котовскага


Последний раз редактировалось Котяра; 12.04.2010 в 12:29.