Trabalhando com pixels

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.