![]() |
|
||||||||||
|
|||||
|
Регистрация: Jun 2006
Сообщений: 28
|
Цитата:
1. Экземпляр класса МувиКлип занимает в памяти примерно на 20 байт больше, чем Спрайт. Создайте тысяч 10 того и другого и сравните System.totalMemory (я сравнивал). Так что рассказы о том, что клип несет на себе огромный тяжелый функционал не соответствуют действительности. Весь стандартный функционал Спрайтов и МувиКлипов, равно как и описание структуры заложено в плеере, а не в Вашем файле, так что никуда Вы его не притащите, даже если захотите. Если, например, таймлайна у клипа нет, его и в памяти нет, вся Ваша плата за использование МувиКлипа составит порядка указанных 20 байт. Поскольку выделение памяти сильно зависит от внешних факторов, при запуске одного и того же файла несколько раз подряд Вы легко получите разброс в 5-10 Кб, даже без загрузки изображений, так что столь подчеркиваемой Вами разницы между МувиКлипом и Спрайтом в реальности Вы не заметите. Теперь - зачем? На практике Вам придется загружать картинки в МувиКлипы (созданные вручную и не Вами) с таймлайном и фреймами. Мне приходится. Так что мне лично удобнее иметь универсальный код, который всегда работает с клипами и я не задумываюсь о том, есть в клипе, с которым я работаю таймлайн или нет. Если Вам лично не нравится использовать клипы, используйте спрайты, но рассказывать страшилки про огромный функционал и массивность кода не надо, ибо их нет. Видимых без микроскопа "преимуществ" Спрайтов тоже нет. 2. Битмап и почему он лучше. Опять же, разница при создании Битмапа вместо просто БитмапДаты составляет несколько байт. За это Вы получаете доступ к двум важным параметрам, влияющим на сглаживание картинки, которые Вы можете менять после того, как она была создана. А менять их, опять же на практике, Вам придется, так же как придется менять размер картинки и прочее. Получив к ним доступ, просто залив прямоугольник beginBitmapFill-ом, Вы не сможете. Гораздо лучше написать с самого начала легко расширяемый код (и пожертвовать парой байт), чем потом столкнуться с проблемой последующего сглаживания и переписывать его, удаляя все Ваши beginBitmapFill-ы и вводя Битмапы. Занимался этим сам, так что другим советую с самого начала Битмап. 3. Клонирование. Я уже написал два примера, один с клонированием, другой без, используйте, какой хотите, так что вопрос не ясен. Зачем нужно клонирование вообще? Затем, что когда Вы загружаете несколько картинок с помощью одного лоадера, beginBitmapFill, как впрочем и Битмар, использует ссылку на текущую БитмапДату лоадера. Так что при загрузке следующей картинки, предыдущая само собой перезапишется. На случай, если их все нужно сохранять, используйте клонирование, пример я уже привел. ну и поиграться, если кому интересно: 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. |
![]() |
Часовой пояс GMT +4, время: 17:49. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|