Het handmatig in cache plaatsen van bitmaps

Gebruik de BitmapData-klasse om het in cache plaatsen van bitmaps aan te passen.

Het volgende voorbeeld gebruikt één gerasterde bitmapversie van een weergaveobject opnieuw en verwijst naar hetzelfde BitmapData-object. Wanneer elk weergaveobject wordt geschaald, wordt het originele BitmapData-object in het geheugen niet bijgewerkt en niet opnieuw getekend. Met deze methode worden processorbronnen bespaard en worden toepassingen sneller uitgevoerd. Wanneer een weergaveobject wordt geschaald, wordt de ingesloten bitmap uitgerekt.

Hier is de bijgewerkte 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(); 
        } 
    } 
}

De alfawaarde wordt nog steeds op elk frame gewijzigd. De volgende code geeft de oorspronkelijke bronbuffer door aan elke BitmapApple-instantie:

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

Deze techniek vergt slechts weinig van het geheugen, aangezien er slechts één cachebitmap wordt gebruikt door het geheugen die door alle BitmapApple -instanties wordt gedeeld. Bovendien wordt de originele bronbitmap nooit bijgewerkt ondanks eventuele wijzigingen die worden gemaakt in de BitmapApple -instanties, zoals alfa, roteren en schalen. Het gebruik van deze techniek voorkomt een vermindering van de prestaties.

Voor een vloeiende uiteindelijke bitmap stelt u de eigenschap smoothing in op true :

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

Aanpassing van de Stage-kwaliteit kan de prestaties ook verbeteren. Stel de Stage-kwaliteit in op HIGH vóór de rastering wordt uitgevoerd en schakel nadien over naar 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 ); 
}

Een handige techniek om content met antialiasing op het scherm te krijgen, is het in- en uitschakelen van de Stage-kwaliteit vóór en na het tekenen van de vector naar een bitmap. Deze techniek kan bijzonder effectief zijn, ongeacht de uiteindelijke Stage-kwaliteit. U kunt bijvoorbeeld een bitmap met antialiasing maken met tekst met antialising, ook als de Stage-kwaliteit is ingesteld op LOW . Deze techniek is niet mogelijk met de eigenschap cacheAsBitmap . In dat geval wordt door het instellen van de Stage-kwaliteit op LOW de vectorkwaliteit bijgewerkt, waardoor de bitmapoppervlakken in het geheugen en ook de uiteindelijke kwaliteit worden bijgewerkt.