BitmapData クラスを使用して、カスタムのビットマップキャッシュ機能を作成します。
次の例は、表示オブジェクトのラスタライズされた単一のビットマップを再利用して、同じ BitmapData オブジェクトを参照します。各表示オブジェクトを拡大 / 縮小したときに、メモリ内にある元の BitmapData オブジェクトの更新や再描画は行われません。この手法は、CPU リソースを節約してアプリケーションの実行を高速化します。表示オブジェクトを拡大 / 縮小すると、含まれているビットマップが伸縮します。
更新された
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
に設定すると、ベクターの画質が更新されます。これにより、メモリ内のビットマップサーフェスと最終品質が更新されます。