Pinte píxeles utilizando el método
setVector()
.
Al pintar píxeles, se pueden llevar a cabo algunas optimizaciones sencillas simplemente utilizando los métodos apropiados de la clase BitmapData. Un modo rápido de pintar píxeles consiste en usar el 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 );
Al emplear métodos lentos como, por ejemplo,
setPixel()
o
setPixel32()
, utilice los métodos
lock()
y
unlock()
para agilizar el proceso de ejecución. En el siguiente código, los métodos
lock(
) y
unlock()
se utilizan para mejorar el rendimiento:
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
El método
lock()
de la clase BitmapData bloquea una imagen y evita que los objetos que le hacen referencia se actualicen cuando cambia el objeto BitmapData. Por ejemplo, si un objeto Bitmap hace referencia a BitmapData, es posible bloquear el objeto BitmapData, cambiarlo y posteriormente bloquearlo. El objeto Bitmap no se cambia hasta que se desbloquee el objeto BitmapData. Para mejorar el rendimiento, utilice este método junto con el método
unlock()
antes y después de realizar numerosas llamadas al método
setPixel()
o
setPixel32()
. Al llamar a
lock()
y
unlock()
, se evita que la pantalla se actualice de forma innecesaria.
Nota:
cuando se procesan píxeles en un mapa de bits fuera de la lista de visualización (doble almacenamiento en búfer), a veces esta técnica no mejora el rendimiento. Si un objeto de mapa de bits no hace referencia al búfer de mapa de bits, el uso de
lock()
y
unlock()
no supone una mejora de rendimiento. Flash Player detecta que el búfer no cuenta con referencias y el mapa de bits no se representa en pantalla.
Es probable que los métodos que se repiten en los píxeles como, por ejemplo,
getPixel()
,
getPixel32()
,
setPixel()
y
setPixel32()
, sean lentos, especialmente en dispositivos móviles. Si es posible, utilice métodos que recuperen todos los píxeles en una llamada. Para la lectura de píxeles, utilice el método
getVector()
, que resulta más rápido que
getPixels()
. Asimismo, recuerde el uso de las API basadas en los objetos Vector, ya que es probable que su ejecución sea más rápida.