Verwenden Sie zum Zeichnen von Pixeln die
setVector()
-Methode.
Beim Zeichnen von Pixeln lassen sich einige einfache Optimierungen erzielen, indem die geeigneten Methoden der BitmapData-Klasse verwendet werden. Eine schnelle Möglichkeit, Pixel zu zeichnen, ist die Verwendung der
setVector()
-Methode:
// 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 );
Bei langsamen Methoden, wie
setPixel()
oder
setPixel32()
, sollten Sie die Methoden
lock()
und
unlock()
verwenden, um die Ausführung zu beschleunigen. Im folgenden Code werden die Methoden
lock()
und
unlock()
verwendet, um die Leistung zu erhöhen:
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
Die
lock()
-Methode der BitmapData-Klasse sperrt ein Bild und verhindert, dass Objekte, die auf das Bild verweisen, bei einer Änderung des BitmapData-Objekts aktualisiert werden. Wenn beispielsweise ein Bitmap-Objekt auf ein BitmapData-Objekt verweist, können Sie das BitmapData-Objekt sperren, ändern und dann wieder entsperren. Das Bitmap-Objekt wird erst geändert, nachdem das BitmapData-Objekt entsperrt wurde. Um die Leistung zu verbessern, verwenden Sie diese Methode zusammen mit der
unlock()
-Methode vor und nach mehreren Aufrufen der Methode
setPixel()
oder
setPixel32()
. Durch Aufrufen der Methoden
lock()
und
unlock()
werden unnötige Aktualisierungen des Bildschirms vermieden.
Hinweis:
Bei der Verarbeitung von Pixeln in einer Bitmap, die sich nicht in der Anzeigeliste befindet (doppelte Pufferung), führt diese Technik nicht in allen Fällen zu Leistungssteigerungen. Wenn ein Bitmap-Objekt nicht auf den Bitmap-Puffer verweist, bewirkt die Verwendung von
lock()
und
unlock()
keine höhere Leistung. Flash Player erkennt, dass nicht auf den Puffer verwiesen wird, und die Bitmap wird nicht auf dem Bildschirm gerendert.
Methoden, die iterativ über Pixel ausgeführt werden, wie beispielsweise
getPixel()
,
getPixel32()
,
setPixel()
und
setPixel32()
, sind normalerweise langsam, besonders auf Mobilgeräten. Verwenden Sie nach Möglichkeit Methoden, die alle Pixel in einem Aufruf abrufen. Verwenden Sie zum Lesen von Pixeln die
getVector()
-Methode, die schneller als die
getPixels()
-Methode ist. Verwenden Sie nach Möglichkeit auch APIs, die sich auf Vector-Objekte stützen, da sie in aller Regel schneller ausgeführt werden.