使用 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();
}
}
}
alpha 值仍會在每個影格上修改。下列程式碼會將原始的來源緩衝區傳送到每個 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
實體進行任何修改 (例如 alpha、旋轉或縮放),都不會更新原始來源點陣圖。使用這個技術可防止效能變慢。
如需平滑的最終點陣圖,請將
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
會更新向量品質,這將會更新記憶體中的點陣圖表面,並更新最終的品質。