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.