Ręczne buforowanie bitmap

W celu zrealizowania własnego mechanizmu buforowania bitmapy należy użyć klasy BitmapData.

W poniższym przykładzie przedstawiono pojedynczą rasteryzowaną wersję bitmapy obiektu wyświetlanego oraz odwołania do tego samego obiektu BitmapData. Skalowanie poszczególnych obiektów wyświetlanych nie powoduje aktualizacji ani ponownego rysowania oryginalnego obiektu BitmapData, który jest zapisany w pamięci. Dzięki temu procesor jest mniej obciążony, a aplikacje działają szybciej. Skalowanie obiektu wyświetlanego powoduje rozciąganie bitmapy, która znajduje się w kontenerze.

Oto zaktualizowana klasa 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(); 
        } 
    } 
}

Wartość alfa nadal jest modyfikowana w każdej klatce. Poniższy kod powoduje przekazanie oryginalnego buforu źródłowego do każdej instancji 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); 
}

Wykorzystywana jest tylko niewielka część pamięci operacyjnej, ponieważ w pamięci używana jest tylko jedna buforowana bitmapa współużytkowana przez wszystkie instancje klasy BitmapApple . Ponadto: oryginalna bitmapa źródłowa nigdy nie jest aktualizowana z wyjątkiem modyfikacji (takich jak zmiana współczynnika alfa, obroty, zmiana skali), które dotyczą instancji klasy BitmapApple . Stosowanie tej techniki zapobiega obniżeniu wydajności.

W celu uzyskania wygładzonej końcowej bitmapy należy ustawić właściwość smoothing na true :

public function BitmapApple(buffer:BitmapData) 
{ 
    super (buffer); 
  
    smoothing = true; 
  
    addEventListener(Event.ADDED_TO_STAGE, activation); 
     addEventListener(Event.REMOVED_FROM_STAGE, deactivation);     
}

Odpowiednia zmiana jakości stołu montażowego może powodować wzrost wydajności. Jakość stołu montażowego należy ustawić na HIGH przed rasteryzacją, a następnie przełączyć na 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 ); 
}

Zmiana jakości stołu montażowego przed rysowaniem i po narysowaniu wektora na bitmapie może być bardzo wydajną techniką wyświetlania wygładzonej treści na ekranie. Ta technika może być skuteczna bez względu na końcową jakość stołu montażowego. Na przykład: można uzyskać wygładzoną bitmapę z wygładzonym tekstem, nawet wówczas, gdy jakość stołu montażowego jest ustawiona na LOW . Ta technika nie jest dostępna w przypadku korzystania z właściwości cacheAsBitmap . W takim przypadku ustawienie jakości stołu montażowego na LOW powoduje aktualizację jakości wektora, co wywołuje aktualizację powierzchni bitmapy w pamięci i zmianę ostatecznej jakości.