Mise en cache manuelle sous forme de bitmap

Utilisez la classe BitmapData pour créer un comportement personnalisé de mise en cache des bitmaps.

L’exemple ci-après réutilise une version bitmap pixellisée unique d’un objet d’affichage et fait référence à un même objet BitmapData. Lors de la mise à l’échelle de chaque objet d’affichage, l’objet BitmapData original en mémoire ni n’est ni mis à jour ni redessiné. Cette technique permet d’économiser les ressources de l’unité centrale et accélère l’exécution des applications. Lors de la mise à l’échelle de l’objet d’affichage, le bitmap contenu est étiré.

La classe BitmapApple mise à jour se présente comme ceci :

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

La valeur alpha est toujours modifiée sur chaque image. Le code suivant transmet la mémoire tampon source d’origine à chaque occurrence 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); 
}

Cette technique consomme peu de mémoire, car un seul bitmap mis en cache est utilisé en mémoire et partagé par toutes les occurrences de BitmapApple . En outre, malgré les modifications apportées aux occurrences de BitmapApple (modification de la propriété alpha, rotation ou mise à l’échelle, par exemple), le bitmap source original n’est jamais mis à jour. Cette technique empêche un ralentissement des performances.

Pour obtenir au final un bitmap lisse, définissez la propriété smoothing sur true :

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

Le réglage du paramètre de qualité de scène peut également améliorer les performances. Définissez-le sur HIGH avant la pixellisation, puis sur LOW après :

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 modification de la qualité de scène avant et après le dessin du vecteur dans un bitmap constitue une puissante technique de création de contenu anticrènelé à l’écran. Cette technique peut être performante quelle que soit la qualité de scène finale. Vous pouvez, par exemple, obtenir un bitmap anticrènelé à partir de texte anticrènelé, même si la qualité de scène est définie sur LOW . Cette technique n’est pas compatible avec la propriété cacheAsBitmap . Dans ce cas, la définition de la qualité de scène sur LOW entraîne la mise à jour de la qualité des vecteurs, ce qui met à jour les surfaces bitmap en mémoire et la qualité finale.