Operazioni con i pixel

Disegno dei pixel con il metodo setVector() .

Quando si disegnano dei pixel, alcune semplici ottimizzazioni possono essere effettuate utilizzando i metodi appropriati della classe BitmapData. Un modo veloce per disegnare i pixel consiste nell'usare il metodo 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 );

Quando usate metodi lenti, ad esempio setPixel() o setPixel32() , servitevi dei metodi lock() e unlock() per ottenere un'esecuzione più rapida. Nel codice seguente, i metodi lock( ) e unlock() vengono utilizzati per migliorare le prestazioni:

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

Il metodo lock() della classe BitmapData blocca un'immagine e impedisce agli oggetti che vi fanno riferimento di essere aggiornati quando l'oggetto BitmapData cambia. Ad esempio, se un oggetto Bitmap fa riferimento a un oggetto BitmapData, potete bloccare l'oggetto BitmapData, modificarlo e quindi sbloccarlo. L'oggetto Bitmap non viene modificato finché non sbloccate l'oggetto BitmapData. Per migliorare le prestazioni, utilizzate questo metodo in combinazione con unlock() prima e dopo numerose chiamate al metodo setPixel() o setPixel32() . Le chiamate a lock() e unlock() consentono di evitare l'aggiornamento non richiesto dello schermo.

Nota: quando si elaborano i pixel di una bitmap che non si trova nell'elenco di visualizzazione (doppio buffering), questa tecnica a volte non migliora le prestazioni. Se l'oggetto bitmap non fa riferimento a un buffer bitmap, l'uso di lock() e unlock() non migliora le prestazioni. Flash Player rileva che il buffer non è associato a un riferimento e non esegue il rendering della bitmap sullo schermo.

I metodi che eseguono iterazioni sui pixel, come getPixel() , getPixel32() , setPixel() e setPixel32() , risultano facilmente lenti, specialmente nei dispositivi mobili. Se possibile, utilizzate metodi che recuperano tutti i pixel in una sola chiamata. Per leggere i pixel, usate il metodo getVector() , che è più veloce di getPixels() . Inoltre, ricordatevi di usare le API che utilizzano gli oggetti Vector, quando è possibile, poiché è probabile che assicurino un'esecuzione più rapida.