Gebruik de BitmapData-klasse om het in cache plaatsen van bitmaps aan te passen.
Het volgende voorbeeld gebruikt één gerasterde bitmapversie van een weergaveobject opnieuw en verwijst naar hetzelfde BitmapData-object. Wanneer elk weergaveobject wordt geschaald, wordt het originele BitmapData-object in het geheugen niet bijgewerkt en niet opnieuw getekend. Met deze methode worden processorbronnen bespaard en worden toepassingen sneller uitgevoerd. Wanneer een weergaveobject wordt geschaald, wordt de ingesloten bitmap uitgerekt.
Hier is de bijgewerkte
BitmapApple
-klasse:
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();
}
}
}
De alfawaarde wordt nog steeds op elk frame gewijzigd. De volgende code geeft de oorspronkelijke bronbuffer door aan elke BitmapApple-instantie:
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);
}
Deze techniek vergt slechts weinig van het geheugen, aangezien er slechts één cachebitmap wordt gebruikt door het geheugen die door alle
BitmapApple
-instanties wordt gedeeld. Bovendien wordt de originele bronbitmap nooit bijgewerkt ondanks eventuele wijzigingen die worden gemaakt in de
BitmapApple
-instanties, zoals alfa, roteren en schalen. Het gebruik van deze techniek voorkomt een vermindering van de prestaties.
Voor een vloeiende uiteindelijke bitmap stelt u de eigenschap
smoothing
in op
true
:
public function BitmapApple(buffer:BitmapData)
{
super (buffer);
smoothing = true;
addEventListener(Event.ADDED_TO_STAGE, activation);
addEventListener(Event.REMOVED_FROM_STAGE, deactivation);
}
Aanpassing van de Stage-kwaliteit kan de prestaties ook verbeteren. Stel de Stage-kwaliteit in op
HIGH
vóór de rastering wordt uitgevoerd en schakel nadien over naar
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 );
}
Een handige techniek om content met antialiasing op het scherm te krijgen, is het in- en uitschakelen van de Stage-kwaliteit vóór en na het tekenen van de vector naar een bitmap. Deze techniek kan bijzonder effectief zijn, ongeacht de uiteindelijke Stage-kwaliteit. U kunt bijvoorbeeld een bitmap met antialiasing maken met tekst met antialising, ook als de Stage-kwaliteit is ingesteld op
LOW
. Deze techniek is niet mogelijk met de eigenschap
cacheAsBitmap
. In dat geval wordt door het instellen van de Stage-kwaliteit op
LOW
de vectorkwaliteit bijgewerkt, waardoor de bitmapoppervlakken in het geheugen en ook de uiteindelijke kwaliteit worden bijgewerkt.