Arbeiten mit Pixeln

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.