Almacenamiento en caché manual de mapas de bits

Use la clase BitmapData para crear un comportamiento personalizado de almacenamiento en caché de mapas de bits.

El siguiente ejemplo reutiliza una sola versión del mapa de bits rasterizado de un objeto de visualización y hace referencia al mismo objeto BitmapData. Al escalar cada objeto de visualización, el objeto BitmapData original en memoria no se actualiza y no se vuelve a dibujar. Con este enfoque se ahorran recursos de CPU y la ejecución de las aplicaciones es más rápida. Al escalar un objeto de visualización, el mapa de bits incluido se expande.

A continuación se incluye la clase BitmapApple actualizada:

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

El valor alfa aún se modifica en cada fotograma. El siguiente código transmite el búfer de origen original a cada instancia de 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); 
}

Esta técnica utiliza solamente una pequeña cantidad de memoria, ya que únicamente se utiliza un solo mapa de bits almacenado en caché en memoria y se comparte por todas las instancias de BitmapApple . Asimismo, a pesar de las modificaciones realizadas en las instancias de BitmapApple , como alfa, la rotación y la escala, el mapa de bits de origen nunca se actualiza. Con la utilización de esta técnica se evita la ralentización del rendimiento.

Para un mapa de bits final suavizado, establezca la propiedad smoothing en true :

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

El ajuste de la calidad del escenario también puede mejorar el rendimiento. Establezca la calidad del escenario en HIGH antes de la rasterización; posteriormente, cambie a 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 ); 
}

Alternar la calidad del escenario antes y después del dibujo del vector a un mapa de bits puede resultar una técnica eficaz para obtener contenido suavizado en pantalla. Esta técnica puede ser eficaz independientemente de la calidad final del escenario. Por ejemplo, se puede obtener un mapa de bits suavizado con texto suavizado, aunque la calidad del escenario se establezca en LOW . Esa técnica no es posible con la propiedad cacheAsBitmap . En ese caso, el establecimiento de la calidad del escenario en LOW actualiza la calidad del vector, con lo cual se actualizan las superficies del mapa de bits en memoria, así como la calidad final.