Arbeta med pixlar

Rita pixlar med metoden setVector() .

När du ritar pixlar kan du göra några enkla optimeringar bara genom att använda lämpliga metoder i klassen BitmapData. Ett snabbt sätt att rita pixlar är att använda metoden 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 );

När du använder långsamma metoder såsom setPixel() eller setPixel32() , ska du använda metoderna lock() och unlock() för att få förloppen att gå snabbare. I följande kod används metoderna lock( ) och unlock() för att förbättra prestandan:

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

Metoden lock() i BitmapData-klassen används för att låsa en bild och förhindra att objekt som refererar till den uppdateras när BitmapData-objektet ändras. Om till exempel ett bitmappsobjekt refererar till ett BitmapData-objekt, kan du låsa BitmapData-objektet, ändra det och sedan låsa upp det. Bitmappsobjekt ändras inte förrän BitmapData-objektet är upplåst. Använd den här metoden tillsammans med unlock() -metoden före och efter flera anrop till setPixel() - eller setPixel32() -metoden för att få bättre prestanda. Genom att lock() och unlock() kommer skärmen inte att uppdateras i onödan.

Obs! När pixlar bearbetas på en bitmapp, inte på visningslistan (dubbel buffring), kan detta ibland innebära att prestandan inte förbättras. Om ett bitmappsobjekt inte refererar bitmappsbufferten, kommer du inte att förbättra prestandan genom att använda lock() och unlock() . I Flash Player upptäcks att bufferten inte refereras och bitmappen kommer inte att återges på skärmen.

Metoder som itererar över pixlar, till exempel getPixel() , getPixel32() , setPixel() och setPixel32() , kommer troligtvis att vara långsamma. Detta gäller speciellt för mobila enheter. Du ska om möjligt använda metoder som hämtar alla pixlar i ett anrop. När du vill läsa pixlar ska du använda metoden getVector() som är snabbare än metoden getPixels() . Tänk även på att använda API:er som förlitar sig på vektorobjekt när det är möjligt, eftersom de troligtvis körs snabbare.