手動點陣圖快取

使用 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 會更新向量品質,這將會更新記憶體中的點陣圖表面,並更新最終的品質。