Armazenamento manual de bitmaps em cache

Use a classe BitmapData para criar o comportamento de armazenamento de bitmap personalizado em cache.

O exemplo a seguir reutiliza uma simples versão do bitmap rasterizado de um objeto de exibição e faz referência ao mesmo objeto BitmapData. Ao escalar cada objeto de exibição, o objeto BitmapData original na memória não é atualizado nem redesenhado. Esta abordagem economiza recursos da CPU e faz com que os aplicativos sejam executados mais rapidamente. Quando o objeto de exibição é dimensionado, o bitmap contido é alongado.

Esta é a classe BitmapApple atualizada:

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

O valor alfa continua sendo modificado a cada quadro. O código a seguir envia o buffer de fonte original para cada ocorrência 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 apenas uma pequena quantidade de memória, porque apenas um bitmap armazenado individualmente é utilizado na memória e compartilhado por todas as ocorrências BitmapApple . Além disso, apesar de quaisquer modificações feitas às instâncias de BitmapApple , como alfa, rotação ou dimensionamento, o bitmap de fonte original não é atualizado nunca. O uso desta técnica impede a desaceleração do desempenho.

Para obter um bitmap final suave, defina a propriedade smoothing como true :

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

O ajuste da qualidade do Palco pode aumentar o desempenho também. Defina a qualidade do Palco como HIGH antes da rasterização e, em seguida, mude-a para 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 ); 
}

Alterar a qualidade de Palco antes e depois de desenhar o vetor em um bitmap pode ser uma poderosa técnica de conseguir conteúdo suavizado na tela. Esta técnica pode ser eficaz independente da qualidade final do palco. Por exemplo, você pode conseguir um bitmap suavizado com texto suavizado, mesmo com a qualidade de Palco ajustada para LOW . Essa técnica não é possível com a propriedade cacheAsBitmap . Nesse caso, definir a qualidade do Palco como LOW atualiza a qualidade do vetor, o que atualiza as superfícies do bitmap na memória e atualiza a qualidade final.