Сжатие BitmapData - PullRequest
       11

Сжатие BitmapData

0 голосов
/ 22 июня 2011

Ситуация такая:

Я написал простую замену MovieClip, которая преобразует существующий импортированный MovieClip в последовательность BitmapData. Это устраняет необходимость для Flash отображать векторные данные в мувиклипе в каждом кадре.

Но у BitmapData большой объем памяти. Я попытался преобразовать BitmapData в ByteArray и использовать метод compress (). Это приводит к значительно меньшему объему памяти. Но это оказалось непрактичным. Для каждой перерисовки я пытался распаковывать () ByteArray, затем использовать SetPixels для перетаскивания данных на экран, затем повторно сжимать () кадр. Это работает, но ужасно медленно.

Так что мне было интересно, есть ли у кого-нибудь еще подход, который я мог бы попробовать. Можно ли во Flash сжимать растровые данные в памяти и быстро перетаскивать их на экран?

Интересно, как нативные анимированные GIF-файлы работают во Flash? Распаковывает ли он их в BitmapData за кулисами, или распаковка кадров выполняется на лету?

Может быть, есть проект Alchemy, который пытается перехватить сжатые изображения?

Спасибо за любой совет, который вы можете предложить:)

Ответы [ 3 ]

1 голос
/ 13 декабря 2012

@ thienhaflash отзыв хороший, но выдержал год, и с тех пор Flash Player и AIR Runtime расширили свои возможности. Сегодня я наткнулся на этот маленький кусочек из Adobe AS3 Guide . Начиная с плеера 11.3 доступны собственные методы сжатия изображений. Вот фрагмент кода:

// Compress a BitmapData object as a JPEG file. 
var bitmapData:BitmapData = new BitmapData(640,480,false,0x00FF00); 
var byteArray:ByteArray = new ByteArray(); 
bitmapData.encode(new Rectangle(0,0,640,480), new flash.display.JPEGEncoderOptions(), byteArray);

Не уверен насчет практичности блиттинга, но приятно, что это можно сделать изначально.

0 голосов
/ 02 февраля 2013

это старый вопрос, но есть недавняя информация по этому поводу: Джексон Данстан пробежал с битмапдатами, и оказалось, что битмап-данные, полученные из сжатых источников, через некоторое время «сдут». Вот статьи: http://jacksondunstan.com/articles/2112, и две ссылки в начале.

Так что вы можете сделать что-то вроде:

var byteArray:ByteArray = new ByteArray(); 
myBitmapData.encode(new Rectangle(0,0,640,480), new flash.display.JPEGEncoderOptions(), byteArray);
var loader = new Loader();
loader.addEventListener(Event.COMPLETE, function(_e:Event):void{
  if(loader.content is Bitmap){
    myBitmapData.dispose()
    myBitmapData= Bitmap(loader.content).bitmapData;
  }
});
loader.loadBytes(byteArray);

Я не уверен, что он будет работать как есть, и вы определенно хотите лучше обращаться с памятью. но теперь myBitmapData будет распакован при попытке чтения с него, а затем повторно сжат, если вы не используете его в течение примерно десяти секунд.

0 голосов
/ 24 июня 2011

Для резервирования памяти вам необходимо дважды подумать, прежде чем конвертировать мувиклип в растровую последовательность. Это действительно так нужно? Можете ли вы разбить вещи на части, поскольку есть несколько вещей (например, фон), которые статичны (или просто перемещаются), почему бы не кэшировать битовую карту для каждого элемента вместо одной большой последовательности битовой карты?

Я обычно использовал AnimatedBitmap (название альтернативы битовой последовательности для мувиклипа) только для анимированных иконок небольшого размера и других сложных вычислений (таких как эффекты огня / дыма ...). Просто разбей вещи как можно больше!

Насколько я знаю, нет способа сжать память, используемую BitmapData, расположенной в памяти, и ничто, связанное с Алхимией, не может помочь улучшить память, используемую в этом случае.

Анимированный GIF изначально не работает во Flash, для этого вам понадобится библиотека. Ищите библиотеку AnimatedGIF as3 от bytearray.com, на самом деле библиотека просто читает файл gif в необработанном byteArray и конвертирует в animatedBitmap точно так же, как вы сделали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...