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.