Praca z pikselami

Do malowania pikseli należy używać metody setVector() .

Podczas malowania pikseli możliwa jest prosta optymalizacja poprzez stosowanie odpowiednich metod klasy BitmapData. Szybszym sposobem rysowania pikseli jest używanie metody setVector() :

// Image dimensions 
var wdth:int = 200; 
var hght:int = 200; 
var total:int = wdth*hght; 
  
// Pixel colors Vector 
var pixels:Vector.<uint> = new Vector.<uint>(total, true); 
  
for ( var i:int = 0; i< total; i++ ) 
{ 
    // Store the color of each pixel 
    pixels[i] = Math.random()*0xFFFFFF; 
} 
  
// Create a non-transparent BitmapData object 
var myImage:BitmapData = new BitmapData ( wdth, hght, false ); 
var imageContainer:Bitmap = new Bitmap ( myImage ); 
  
// Paint the pixels 
myImage.setVector ( myImage.rect, pixels ); 
addChild ( imageContainer );

W przypadku korzystania z metod powolnych, takich jak setPixel() lub setPixel32() , należy użyć metod lock() i unlock() w celu przyspieszenia wykonywania kodu. W poniższym kodzie metody lock( ) i unlock() służą do zwiększania wydajności:

var buffer:BitmapData = new BitmapData(200,200,true,0xFFFFFFFF); 
var bitmapContainer:Bitmap = new Bitmap(buffer); 
var positionX:int; 
var positionY:int; 
  
// Lock update 
buffer.lock(); 
var starting:Number=getTimer(); 
  
for (var i:int = 0; i<2000000; i++) 
{ 
    // Random positions 
    positionX = Math.random()*200; 
    positionY = Math.random()*200; 
    // 40% transparent pixels 
    buffer.setPixel32( positionX, positionY, 0x66990000 ); 
} 
  
// Unlock update 
buffer.unlock(); 
addChild( bitmapContainer ); 
  
trace( getTimer () - starting ); 
// output : 670

Metoda lock() klasy BitmapData blokuje obraz i zapobiega aktualizacji obiektów, które się do niego odwołują, w przypadku zmiany obiektu BitmapData. Na przykład: jeśli obiekt Bitmap odwołuje się do obiektu BitmapData, można zablokować obiekt BitmapData, zmienić go, a następnie odblokować. Obiekt Bitmap nie zostanie zmieniony, dopóki nie nastąpi odblokowanie obiektu BitmapData. W celu podwyższenia wydajności należy stosować tą metodę wraz z metodą unlock() przed i po wielokrotnych wywołaniach do metody setPixel() i setPixel32() . Wywołanie metod lock() i unlock() zapobiega zbędnym aktualizacjom treści wyświetlanej na ekranie.

Uwaga: Ta technika nie poprawia wydajności w przypadku przetwarzania pikseli na bitmapie zamiast na liście wyświetlania (podwójne buforowanie). Jeśli obiekt bitmapy nie odwołuje się do buforu bitmapy, wówczas użycie lock() i unlock() nie zwiększa wydajności. Program Flash Player wykrywa, że nie istnieją żadne odwołania do buforu i dlatego bitmapa nie jest renderowana na ekranie.

Metody, które iteracyjnie przechodzą przez piksele, takie jak getPixel() , getPixel32() , setPixel() i setPixel32() , mogą działać powoli, szczególnie na urządzeniach mobilnych. Jeśli to możliwe, należy korzystać z takich metod, które pobierają wszystkie piksele w jednym wywołaniu. W celu odczytywania pikseli należy korzystać z metody getVector() , która działa szybciej niż metoda getPixels() . Ponadto w miarę możliwości należy korzystać z interfejsów API, które operują na obiektach Vector, ponieważ takie wywołania prawdopodobnie będą działać szybciej.