Используйте класс BitmapData для создания пользовательского поведения кэширования растрового изображения.
В следующем примере повторно используется одна растрированная версия экранного объекта и выполняется обращение к одному объекту BitmapData. При масштабировании каждого экранного объекта исходный объект BitmapData в памяти не обновляется и не перерисовывается. Этот подход позволяет сэкономить ресурсы ЦП и способствует более быстрому выполнению приложения. При масштабировании экранного объекта растровое изображение в контейнере растягивается.
Здесь приводится обновленный класс
BitmapApple
.
package org.bytearray.bitmap
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.events.Event;
public class BitmapApple extends Bitmap
{
private var destinationX:Number;
private var destinationY:Number;
public function BitmapApple(buffer:BitmapData)
{
super(buffer);
addEventListener(Event.ADDED_TO_STAGE,activation);
addEventListener(Event.REMOVED_FROM_STAGE,deactivation);
}
private function activation(e:Event):void
{
initPos();
addEventListener(Event.ENTER_FRAME,handleMovement);
}
private function deactivation(e:Event):void
{
removeEventListener(Event.ENTER_FRAME,handleMovement);
}
private function initPos():void
{
destinationX = Math.random()*(stage.stageWidth - (width>>1));
destinationY = Math.random()*(stage.stageHeight - (height>>1));
}
private function handleMovement(e:Event):void
{
alpha = Math.random();
x -= (x - destinationX)*.5;
y -= (y - destinationY)*.5;
if ( Math.abs(x - destinationX) < 1 && Math.abs(y - destinationY) < 1)
initPos();
}
}
}
Альфа-коэффициент все так же изменяется в каждом кадре. Следующий код передает исходный буфер источника каждому экземпляру BitmapApple.
import org.bytearray.bitmap.BitmapApple;
const MAX_NUM:int = 100;
var holder:Sprite = new Sprite();
addChild(holder);
var holderVector:Vector.<BitmapApple> = new Vector.<BitmapApple>(MAX_NUM, true);
var source:AppleSource = new AppleSource();
var bounds:Object = source.getBounds(source);
var mat:Matrix = new Matrix();
mat.translate(-bounds.x,-bounds.y);
var buffer:BitmapData = new BitmapData(source.width+1, source.height+1, true, 0);
buffer.draw(source,mat);
var bitmapApple:BitmapApple;
for (var i:int = 0; i< MAX_NUM; i++)
{
bitmapApple = new BitmapApple(buffer);
holderVector[i] = bitmapApple;
holder.addChild(bitmapApple);
}
Этот способ занимает мало памяти, потому что в памяти хранится единое кэшированное растровое изображение, которое используется всеми экземплярами
BitmapApple
. Помимо этого, несмотря на все изменения, вносимые в экземпляры
BitmapApple
, такие как изменение альфа-канала, поворот или масштабирование, исходное растровое изображение никогда не обновляется. Этот прием позволяет предотвратить снижение производительности.
Для получения сглаженного конечного растрового изображения задайте для свойства
smoothing
значение
true
:
public function BitmapApple(buffer:BitmapData)
{
super (buffer);
smoothing = true;
addEventListener(Event.ADDED_TO_STAGE, activation);
addEventListener(Event.REMOVED_FROM_STAGE, deactivation);
}
Настройка качества рабочей области также может повысить производительность. Задайте для качества рабочей области значение
HIGH
перед растрированием, а затем измените значение на
LOW
.
import org.bytearray.bitmap.BitmapApple;
const MAX_NUM:int = 100;
var holder:Sprite = new Sprite();
addChild ( holder );
var holderVector:Vector.<BitmapApple> = new Vector.<BitmapApple>(MAX_NUM, true);
var source:AppleSource = new AppleSource();
var bounds:Object = source.getBounds ( source );
var mat:Matrix = new Matrix();
mat.translate ( -bounds.x, -bounds.y );
var buffer:BitmapData = new BitmapData ( source.width+1, source.height+1, true, 0 );
stage.quality = StageQuality.HIGH;
buffer.draw ( source, mat );
stage.quality = StageQuality.LOW;
var bitmapApple:BitmapApple;
for (var i:int = 0; i< MAX_NUM; i++ )
{
bitmapApple = new BitmapApple( buffer );
holderVector[i] = bitmapApple;
holder.addChild ( bitmapApple );
}
Изменение качества рабочей области до и после перевода векторного изображения в растровое — эффективный метод вывода на экран сглаженного содержимого. Его эффективность не зависит от финального качества рабочей области. Например, можно получить растровое изображение и текст со сглаживанием, даже если для качества рабочей области задано значение
LOW
. Этот прием нельзя использовать со свойством
cacheAsBitmap
. В этом случае при задании для качества рабочей области значения
LOW
обновляется качество вектора, а также поверхность растрового изображения в памяти и качество конечного изображения.