Caching manuale delle bitmap

Utilizzate la classe BitmapData per creare comportamenti di caching bitmap personalizzati.

L'esempio seguente riutilizza una singola versione bitmap rasterizzata di un oggetto di visualizzazione e fa riferimento allo stesso oggetto BitmapData. Quando viene ridimensionato ciascun oggetto di visualizzazione, l'oggetto BitmapData originale presente in memoria non viene aggiornato né ridisegnato. Questo approccio consente di risparmiare risorse della CPU e di eseguire più rapidamente le applicazioni. Quando si ridimensiona l'oggetto di visualizzazione, la bitmap contenuta viene allungata.

Questa è la classe BitmapApple aggiornata:

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

Il valore alfa viene comunque modificato su ciascun fotogramma. Il codice seguente passa il buffer sorgente originale a ogni istanza 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); 
}

Questa tecnica consuma solo una piccola quantità di memoria, poiché solo una singola bitmap memorizzata nella cache viene utilizzata nella memoria e condivisa da tutte le istanze BitmapApple . Inoltre, nonostante tutte le modifiche apportate alle istanze BitmapApple (ad esempio la modifica alfa, la rotazione o il ridimensionamento), la bitmap sorgente originale non viene mai aggiornata. L'uso di questa tecnica evita un possibile rallentamento delle prestazioni.

Per ottenere una bitmap finale fluida, impostate la proprietà smoothing su true :

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

Anche la regolazione della qualità dello stage può migliorare le prestazioni. Impostate la qualità dello stage su HIGH prima della rasterizzazione, quindi passate a LOW in seguito:

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

La regolazione della qualità dello stage prima e dopo della rasterizzazione di un vettore in bitmap può rappresentare una tecnica sofisticata per la visualizzazione del contenuto con antialiasing sullo schermo. Questa tecnica può rivelarsi efficace indipendentemente dalla qualità finale dello stage. Ad esempio, potete ottenere una bitmap con antialiasing con testo con antialiasing anche con la qualità dello stage impostata su LOW . Questa tecnica non è utilizzabile con la proprietà cacheAsBitmap . Con tale proprietà, l'impostazione della qualità dello stage su LOW determina un aggiornamento della qualità del vettore, che a sua volta produce un aggiornamento delle superfici bitmap in memoria e infine un aggiornamento della qualità finale.