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.