Manuelle Bitmap-Zwischenspeicherung

Verwenden Sie die BitmapData-Klasse, um ein benutzerdefiniertes Verhalten für die Bitmap-Zwischenspeicherung zu erstellen.

Im folgenden Beispiel wird eine einzelne gerasterte Bitmapversion eines Anzeigeobjekts wiederverwendet, wobei auf dasselbe BitmapData-Objekt verwiesen wird. Beim Skalieren der einzelnen Anzeigeobjekte wird das ursprüngliche BitmapData-Objekt weder im Arbeitsspeicher aktualisiert noch neu gezeichnet. Mit dieser Technik können Sie CPU-Ressourcen einsparen und die Anwendungsausführung beschleunigen. Beim Skalieren des Anzeigeobjekts wird die enthaltene Bitmap gestreckt.

Dies ist die aktualisierte BitmapApple -Klasse:

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

Der Alphawert wird immer noch in jedem Bild geändert. Der folgende Code übergibt den ursprünglichen Quellpuffer an jede BitmapApple-Instanz:

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); 
}

Für diese Technik ist nur wenig Arbeitsspeicher erforderlich, da nur eine zwischengespeicherte Bitmap im Arbeitsspeicher verwendet und von allen BitmapApple -Instanzen gemeinsam genutzt wird. Außerdem wird die ursprüngliche Quellbitmap nie aktualisiert, unabhängig von Änderungen, die an den BitmapApple -Instanzen vorgenommen werden (wie beispielsweise Alphawert, Drehungen oder Skalierungen). Diese Technik verhindert einen Leistungsabfall.

Damit die endgültige Bitmap glatt aussieht, setzen Sie die smoothing -Eigenschaft auf true :

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

Auch eine Anpassung der Bühnenqualität kann die Leistung verbessern. Setzen Sie die Bühnenqualität vor dem Rastern auf HIGH und danach auf 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 ); 
}

Das Wechseln der Bühnenqualität vor und nach dem Zeichnen eines Vektors als Bitmap kann eine äußerst leistungsstarke Strategie sein, um Anti-Aliasing-Text auf dem Bildschirm anzuzeigen. Diese Technik kann unabhängig von der endgültigen Bühnenqualität gute Ergebnisse liefern. Beispielsweise lässt sich eine Anti-Aliasing-Bitmap mit Anti-Aliasing-Text erzielen, selbst wenn die Bühnenqualität auf LOW eingestellt ist. Diese Technik kann mit der cacheAsBitmap -Eigenschaft nicht eingesetzt werden. In diesem Fall bewirkt die Einstellung LOW für die Filmqualität, dass die Vektorqualität aktualisiert wird. Dadurch werden die Bitmapoberflächen im Arbeitsspeicher und dann auch die endgültige Qualität aktualisiert.