Bitmap'leri elle önbelleğe alma

Ö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.