Показать сообщение отдельно
Старый 11.07.2010, 22:28
aliim вне форума Посмотреть профиль Отправить личное сообщение для aliim Найти все сообщения от aliim
  № 6  
Ответить с цитированием
aliim

Регистрация: Jun 2006
Сообщений: 28
Цитата:
Сообщение от Wolsh Посмотреть сообщение
Вот не надо делать вид, что я тупо решил попридираться. Я абсолютно не понимаю, почему для вывода на сцену картинки нужно создавать экземпляр класса МувиКлип, плюс к этому - экземпляр класса Битмап, да еще и клонировать БитмапДату. Не слишком ли много кортежа для одного изображения? По-минимуму нужен только Шейп, залитый методом beginBitmapFill(). Если требуется интерактивность - Спрайт, залитый методом beginBitmapFill(). Если планируются операции по обработке изображения - только тогда может понадобиться Битмап (и то необязательно). И уж точно не понадобится МувиКлип с его временной шкалой и кучей методов для работы с ней. Иначе Вы платите не столько за семечки, сколько за вакуумную упаковку с золотым напылением и полноцветной печатью.
объясняю:
1. Экземпляр класса МувиКлип занимает в памяти примерно на 20 байт больше, чем Спрайт. Создайте тысяч 10 того и другого и сравните System.totalMemory (я сравнивал). Так что рассказы о том, что клип несет на себе огромный тяжелый функционал не соответствуют действительности.
Весь стандартный функционал Спрайтов и МувиКлипов, равно как и описание структуры заложено в плеере, а не в Вашем файле, так что никуда Вы его не притащите, даже если захотите. Если, например, таймлайна у клипа нет, его и в памяти нет, вся Ваша плата за использование МувиКлипа составит порядка указанных 20 байт.
Поскольку выделение памяти сильно зависит от внешних факторов, при запуске одного и того же файла несколько раз подряд Вы легко получите разброс в 5-10 Кб, даже без загрузки изображений, так что столь подчеркиваемой Вами разницы между МувиКлипом и Спрайтом в реальности Вы не заметите.
Теперь - зачем?
На практике Вам придется загружать картинки в МувиКлипы (созданные вручную и не Вами) с таймлайном и фреймами. Мне приходится. Так что мне лично удобнее иметь универсальный код, который всегда работает с клипами и я не задумываюсь о том, есть в клипе, с которым я работаю таймлайн или нет.
Если Вам лично не нравится использовать клипы, используйте спрайты, но рассказывать страшилки про огромный функционал и массивность кода не надо, ибо их нет. Видимых без микроскопа "преимуществ" Спрайтов тоже нет.

2. Битмап и почему он лучше. Опять же, разница при создании Битмапа вместо просто БитмапДаты составляет несколько байт. За это Вы получаете доступ к двум важным параметрам, влияющим на сглаживание картинки, которые Вы можете менять после того, как она была создана. А менять их, опять же на практике, Вам придется, так же как придется менять размер картинки и прочее. Получив к ним доступ, просто залив прямоугольник beginBitmapFill-ом, Вы не сможете.
Гораздо лучше написать с самого начала легко расширяемый код (и пожертвовать парой байт), чем потом столкнуться с проблемой последующего сглаживания и переписывать его, удаляя все Ваши beginBitmapFill-ы и вводя Битмапы. Занимался этим сам, так что другим советую с самого начала Битмап.

3. Клонирование. Я уже написал два примера, один с клонированием, другой без, используйте, какой хотите, так что вопрос не ясен.
Зачем нужно клонирование вообще?
Затем, что когда Вы загружаете несколько картинок с помощью одного лоадера, beginBitmapFill, как впрочем и Битмар, использует ссылку на текущую БитмапДату лоадера. Так что при загрузке следующей картинки, предыдущая само собой перезапишется. На случай, если их все нужно сохранять, используйте клонирование, пример я уже привел.
ну и поиграться, если кому интересно:
Код AS3:
package {
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.events.Event;
 
	import flash.display.Bitmap;
	import flash.display.BitmapData;
 
	import flash.net.URLLoader;
	import flash.display.Loader;
	import flash.net.URLRequest;
 
	import flash.system.System;
	import flash.events.MouseEvent;
	import flash.geom.Matrix;
 
	public class test extends MovieClip {
 
		var imgfon = new Loader  ;
 
		// использовать объект битмап
		var useBitmap:Boolean = true;
 
		// использовать bitmapFill
		//var useBitmap:Boolean = false;
 
		// использовать мувиклипы
		var mc1:MovieClip = new MovieClip  ;
		var mc2:MovieClip = new MovieClip  ;
 
		// использовать спрайты
		// var mc1:Sprite = new Sprite  ;
		// var mc2:Sprite = new Sprite  ;
 
		public function test() {
			var r = new URLRequest("image.jpg");
			imgfon.load(r);
			imgfon.contentLoaderInfo.addEventListener(Event.COMPLETE,go);
 
			addChild(mc1);
			addChild(mc2);
			mc1.addEventListener(MouseEvent.CLICK,mclick);
			mc2.addEventListener(MouseEvent.CLICK,mclick);
 
		}
 
		function go(e:Event) {
 
			var bd:BitmapData = Bitmap(imgfon.content).bitmapData;
 
			if (useBitmap) {
				// вариант с битмапом
				mc1.addChild(new Bitmap(bd,"auto",true));
				mc2.addChild(new Bitmap(bd,"auto",true));
 
			} else {
				// вариант без битмапа
				mc1.graphics.beginBitmapFill(bd,null,false,false);
				mc1.graphics.drawRect(0,0,bd.width, bd.height);
				mc1.graphics.endFill();
				mc2.graphics.beginBitmapFill(bd,null,false,true);
				mc2.graphics.drawRect(0,0,bd.width, bd.height);
				mc2.graphics.endFill();
			}
			// проверка, что оба метода ссылаются на данные загрузчика и копирования не происходит
			// очистка bd удаляет оба изображения
			// bd.dispose();
 
			mc1.height = mc1.height * 250 / mc1.width;
			mc1.width = 250;
			mc2.height = mc2.height * 250 / mc2.width;
			mc2.width = 250;
			mc2.x = 255;
		}
 
		function mclick(e:MouseEvent) {
			if (useBitmap) {
				// 	изменение сглаживания c помощью smoothing, есть еще pixelSnapping
				e.currentTarget.getChildAt(0).smoothing = ! e.currentTarget.getChildAt(0).smoothing;
			}
			text.text = mc1 + " use Bitmap: " + useBitmap + ", memory usage: " + System.totalMemory;
		}
 
	}
 
}


Последний раз редактировалось iNils; 12.07.2010 в 00:03.