Özel bir bitmap'leri arabelleğe alma davranışı oluşturmak için BitmapData sınıfını kullanın.
Aşağıdaki örnek bir görüntüleme nesnesinin tek bir rasterleştirilmiş bitmap versiyonunu yeniden kullanır ve aynı BitmapData nesnesine başvurur. Görüntüleme nesnelerinin her biri ölçeklendirilirken, bellekteki orijinal BitmapData nesnesi güncellenmez ve yeniden çizilmez. Bu yaklaşım CPU kaynaklarından tasarruf sağlar ve uygulamaların daha hızlı çalışmasına olanak verir. Görüntüleme nesnesi ölçeklendirilirken, içerikteki bitmap uzatılır.
Güncellenen
BitmapApple
sınıfı:
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();
}
}
}
Alfa değeri her karede hala değiştirilir. Aşağıdaki kod orijinal kaynak arabelleğini her bir BitmapApple örneğine iletir.
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);
}
Yalnızca önbelleğe alınmış tek bir bitmap bellekte kullanıldığından ve bütün
BitmapApple
örnekleri tarafından paylaşıldığından bu teknik az miktarda bellek kullanır. Ek olarak,
BitmapApple
örneklerine yapılan alfa, döndürme ve ölçeklendirme gibi herhangi bir değişime rağmen, orijinal kaynak bitmap’i asla güncellenmez. Bu tekniğin kullanımı performansta yavaşlamayı önler.
Düzgün bir bitmap sonucu için,
smoothing
özelliğini
true
değerine ayarlayın:
public function BitmapApple(buffer:BitmapData)
{
super (buffer);
smoothing = true;
addEventListener(Event.ADDED_TO_STAGE, activation);
addEventListener(Event.REMOVED_FROM_STAGE, deactivation);
}
Sahne Alanı kalitesini ayarlamak da performansı iyileştirebilir. Sahne Alanı kalitesini, rasterleştirmeden önce
HIGH
değerine ayarlayın ve sonrasında
LOW
değerine geçin.
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 );
}
Sahne Alanı kalitesinin bitmap’e vektörü çizdikten önce ve sonra değiştirilmesi, ekranda kenarları yumuşatılmış içerik elde etmek için kullanışlı bir teknik olabilir. Bu teknik son sahne alanı kalitesinden bağımsız olarak etkili olabilir. Örneğin Sahne Alanı kalitesi
LOW
olarak ayarlıyken bile kenarları yumuşatılmış metin ile beraber kenarları yumuşatılmış bitmap alabilirsiniz. Bu teknik
cacheAsBitmap
özelliği ile kullanılmaz. Bu durumda, Sahne Alanı kalitesinin
LOW
olarak ayarlanması, bellekteki yüzeyleri ve son kaliteyi güncelleyen vektör kalitesini günceller.