Pintar pixels usando o método
setVector()
.
Ao pintar pixels, algumas otimizações simples podem ser feitas pelo simples uso dos métodos apropriados da classe BitmapData. Uma maneira rápida de pintar pixels é usar o método
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 );
Ao usar métodos lentos, como
setPixel()
ou
setPixel32()
, use os métodos
lock()
e
unlock()
para acelerar a execução. No código a seguir, os métodos
lock()
e
unlock()
são usados para aumentar o desempenho:
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
O método
lock()
da classe BitmapData bloqueia uma imagem e impede que objetos que façam referência a ela sejam atualizados quando o objeto BitmapData é alterado. Por exemplo, se um objeto Bitmap fizer referência a um objeto BitmapData, você pode bloquear o objeto BitmapData, alterá-lo e, em seguida, desbloqueá-lo. O objeto Bitmap não é alterado até que o objeto BitmapData seja desbloqueado. Para melhorar o desempenho, use esse método junto com o método
unlock()
antes e depois de várias chamadas aos métodos
setPixel()
ou
setPixel32()
. Chamar
lock()
e
unlock()
impede que a tela seja atualizada desnecessariamente.
Nota:
Ao processar pixels em um bitmap que não consta na lista de exibição (double-buffering), as vezes esta técnica não aumenta o desempenho. Caso um objeto de bitmap não faça referência ao buffer do bitmap, o uso de
lock()
e
unlock()
não aumenta o desempenho. O Flash Player detecta que não há referência ao buffer, e o bitmap não é renderizado na tela.
Métodos que iteram sobre pixels, como
getPixel()
,
getPixel32()
,
setPixel()
, e
setPixel32()
, costumam ser lentos, especialmente em dispositivos móveis. Se possível, utilize métodos que obtenham todos os pixels em uma chamada. Para ler pixels, use o método
getVector()
, que é mais rápido do que o método
getPixels()
. Além disso, lembre-se de usar as APIs que dependem de objetos Vector, quando possível, visto que elas provavelmente serão executadas mais rapidamente.