какой самый экономичный способ сделать снимок экрана с отображаемым объектом в as3

Какой самый экономичный способ сделать скриншот экранного объекта в формате as3?

Это код, который я сейчас использую:

public static function img(o:DisplayObject,width:int,height:int):ByteArray
    {
        var b:BitmapData = new BitmapData(width,height,true,0x000000);
        b.draw(o,new Matrix(o.width/width,0,0,o.height/height),null,null,null,true);
        return new JPGEncoder(35).encode(b);
    }

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

Спасибо.


person Atm    schedule 10.08.2011    source источник


Ответы (1)


Именно кодирование JPEG занимает большую часть времени, а не захват объекта отображения в BitmapData.

Чтобы добиться лучшей производительности (жертвуя временем работы), вы должны использовать некоторую оптимизированную версию стандартного класса JPEGEncoder или/и его асинхронную версию.

Если вас не устраивает вышеизложенное, попробуйте поискать похожие решения в Google: некоторые ребята уже решили проблему.

Примечание: вы также можете реализовать пару оптимизаций.

  • Вам не нужно каждый раз создавать новый экземпляр Matrix. Вы можете использовать один экземпляр, вызывая Matrix.identity() перед рисованием. Это будет полезно, если вы будете выполнять эту операцию много раз в течение одного сеанса работы с приложением.
  • Вам не нужно каждый раз создавать новый экземпляр JPEGEncoder. Вы можете создать его и хранить в каком-нибудь приватном статическом поле (например, создать его при первом вызове img()).
person Michael Antipin    schedule 10.08.2011
comment
@Atern, если кто-то даст вам правильный ответ, вам нужно принять этот ответ, а также проголосовать за него, если хотите. Вы не приняли ответы ни на один из двух вопросов. Это помешает людям помогать вам в будущем. Все, что люди получают за то, что нашли время, чтобы помочь вам, — это репутация от ваших голосов и одобрений. - person ; 11.08.2011
comment
Для голосования требуется 15 репутации. - person Atm; 12.08.2011
comment
Я имел в виду, что не могу голосовать, пока у меня не будет хотя бы 15 очков репутации. Я проголосую за него, как только получу. - person Atm; 07.08.2012