Кэширование растрового изображения вручную

Используйте класс BitmapData для создания пользовательского поведения кэширования растрового изображения.

В следующем примере повторно используется одна растрированная версия экранного объекта и выполняется обращение к одному объекту BitmapData. При масштабировании каждого экранного объекта исходный объект BitmapData в памяти не обновляется и не перерисовывается. Этот подход позволяет сэкономить ресурсы ЦП и способствует более быстрому выполнению приложения. При масштабировании экранного объекта растровое изображение в контейнере растягивается.

Здесь приводится обновленный класс BitmapApple .

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(); 
        } 
    } 
}

Альфа-коэффициент все так же изменяется в каждом кадре. Следующий код передает исходный буфер источника каждому экземпляру 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); 
}

Этот способ занимает мало памяти, потому что в памяти хранится единое кэшированное растровое изображение, которое используется всеми экземплярами BitmapApple . Помимо этого, несмотря на все изменения, вносимые в экземпляры BitmapApple , такие как изменение альфа-канала, поворот или масштабирование, исходное растровое изображение никогда не обновляется. Этот прием позволяет предотвратить снижение производительности.

Для получения сглаженного конечного растрового изображения задайте для свойства smoothing значение true :

public function BitmapApple(buffer:BitmapData) 
{ 
    super (buffer); 
  
    smoothing = true; 
  
    addEventListener(Event.ADDED_TO_STAGE, activation); 
     addEventListener(Event.REMOVED_FROM_STAGE, deactivation);     
}

Настройка качества рабочей области также может повысить производительность. Задайте для качества рабочей области значение HIGH перед растрированием, а затем измените значение на 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 ); 
}

Изменение качества рабочей области до и после перевода векторного изображения в растровое — эффективный метод вывода на экран сглаженного содержимого. Его эффективность не зависит от финального качества рабочей области. Например, можно получить растровое изображение и текст со сглаживанием, даже если для качества рабочей области задано значение LOW . Этот прием нельзя использовать со свойством cacheAsBitmap . В этом случае при задании для качества рабочей области значения LOW обновляется качество вектора, а также поверхность растрового изображения в памяти и качество конечного изображения.