Örnekleri mümkün olduğunca tekrar kullanarak BitmapData sınıfının kullanımını en iyileştirmek önemlidir. Flash Player 10.1 ve AIR 2.5, tüm platformlar için tekli BitmapData başvurusu adında yeni bir özellik sunar. Gömülü görüntüden BitmapData örnekleri oluştururken, bütün BitmapData örnekleri için tek bir bitmap sürümü kullanılır. Bir bitmap daha sonra değiştirilirse, ona bellekte kendi benzersiz bitmap’i verilir. Gömülü görüntü, kütüphaneden veya bir [Embed] etiketinden gelebilir.
Not:
Ayrıca, Flash Player 10.1 ve AIR 2.5, bitmap'leri otomatik olarak yeniden kullandığından mevcut içerik de bu özellikten faydalanır.
Gömülü bir görüntüyü örneklediğiniz zaman bellekte ilişkili bir bitmap oluşturulur. Flash Player 10.1 ve AIR 2.5'ten önce, aşağıdaki şemada gösterildiği gibi bellekte her örneğe ayrı bir bitmap veriliyordu:
Flash Player 10.1 ve AIR 2.5 öncesinde bellekteki bitmap'ler
Flash Player 10.1 ve AIR 2.5'te, aynı görüntünün birden fazla örneği oluşturulduğunda, tüm BitmapData örnekleri için bitmap'in tek bir sürümü kullanılır. Aşağıdaki şema bu kavramı gösterir:
Flash Player 10.1 ve AIR 2.5'te bellekteki bitmap'ler
Bu yaklaşım bir uygulama tarafından birçok bitmap ile kullanılan bellek miktarını önemli ölçüde düşürür. Aşağıdaki kod bir
Star
sembolünün birden fazla örneğini oluşturur:
const MAX_NUM:int = 18;
var star:BitmapData;
var bitmap:Bitmap;
for (var i:int = 0; i<MAX_NUM; i++)
{
for (var j:int = 0; j<MAX_NUM; j++)
{
star = new Star(0,0);
bitmap = new Bitmap(star);
bitmap.x = j * star.width;
bitmap.y = i * star.height;
addChild(bitmap)
}
}
Aşağıdaki resim kodun sonucunu gösterir:
Örneğin, Flash Player 10 ile yukarıdaki animasyon 1008 KB bellek kullanır. Flash Player 10.1 ile, masaüstü ve mobil aygıttaki animasyon yalnızca 4 KB kullanır.
Aşağıdaki kod bir BitmapData örneğini değiştirir:
const MAX_NUM:int = 18;
var star:BitmapData;
var bitmap:Bitmap;
for (var i:int = 0; i<MAX_NUM; i++)
{
for (var j:int = 0; j<MAX_NUM; j++)
{
star = new Star(0,0);
bitmap = new Bitmap(star);
bitmap.x = j * star.width;
bitmap.y = i * star.height;
addChild(bitmap)
}
}
var ref:Bitmap = getChildAt(0) as Bitmap;
ref.bitmapData.pixelDissolve(ref.bitmapData, ref.bitmapData.rect, new Point(0,0),Math.random()*200,Math.random()*200, 0x990000);
Aşağıdaki görüntü bir
Star
örneğini değiştirmenin sonucunu gösterir:
Dahili olarak, piksel değiştirmeleri işlemek için çalışma zamanı otomatik şekilde bellekte bir bitmap atar ve oluşturur. BitmapData sınıfının bir yöntemi çağrıldığında, piksel değiştirilmelerine yol açar, bellekte yeni bir örnek oluşturulur ve başka herhangi bir örnek güncellenmez. Aşağıdaki resim bu kavramı gösterir:
Bir bitmap'i değiştirmenin bellekteki sonucu
Tek bir yıldız değiştirilirse, bellekte yeni bir kopya oluşturulur. Sonuçta elde edilen animasyon, Flash Player 10.1 ve AIR 2.5'te bellekten yaklaşık 8 KB kullanır.
Önceki örnekte, her bitmap ayrı ayrı dönüştürme için kullanılabilir. Yalnızca döşeme efekti oluşturmak için
beginBitmapFill()
yöntemi en uygun yöntemdir:
var container:Sprite = new Sprite();
var source:BitmapData = new Star(0,0);
// Fill the surface with the source BitmapData
container.graphics.beginBitmapFill(source);
container.graphics.drawRect(0,0,stage.stageWidth,stage.stageHeight);
addChild(container);
Bu yaklaşım yalnızca tek bir BitmapData örneğinin oluşturulmasıyla aynı sonucu üretebilir. Yıldızları sürekli olarak döndürmek için her Yıldız örneğine erişmek yerine her karede döndürülen bir Matrix nesnesi kullanın. Bu Matrix nesnesini
beginBitmapFill()
yöntemine iletin:
var container:Sprite = new Sprite();
container.addEventListener(Event.ENTER_FRAME, rotate);
var source:BitmapData = new Star(0,0);
var matrix:Matrix = new Matrix();
addChild(container);
var angle:Number = .01;
function rotate(e:Event):void
{
// Rotate the stars
matrix.rotate(angle);
// Clear the content
container.graphics.clear();
// Fill the surface with the source BitmapData
container.graphics.beginBitmapFill(source,matrix,true,true);
container.graphics.drawRect(0,0,stage.stageWidth,stage.stageHeight);
}
Bu tekniği kullanırken, efekti oluşturmak için herhangi bir ActionScript döngüsüne gerek yoktur. Çalışma zamanı her şeyi dahili olarak gerçekleştirir. Aşağıdaki resim yıldızları dönüştürmenin sonucunu gösterir:
Bu yaklaşımla, orijinal kaynak BitmapData nesnesinin güncellenmesi otomatik olarak onun sahne alanındaki herhangi başka bir yerdeki kullanımını günceller, bu da etkili bir teknik olabilir. Ancak, bu yaklaşım her yıldızın önceki örnekteki gibi teker teker ölçeklendirilmesine olanak tanımaz.
Not:
Aynı görüntünün birden fazla örneğini kullanırken, çizim bir sınıfın bellekteki orijinal bitmap ile ilişkili olup olmadığına bağlıdır. Bitmap ile ilişkili bir sınıf yoksa, görüntüler bitmap dolguları ile Shape nesneleri olarak çizilir.