Werken met pixels

Verfpixels die de setVector() -methode gebruiken.

Wanneer u pixels verft, kunnen er eenvoudige optimalisaties worden uitgevoerd met behulp van methoden in de BitmapData-klasse. U kunt de methode setVector() gebruiken om snel pixels te tekenen:

// 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 );

Wanneer u langzame methoden gebruikt, zoals setPixel() of setPixel32() , gebruikt u de methoden lock() en unlock() voor een snellere uitvoering. In de volgende code worden de methoden lock() en unlock() gebruikt om de prestatie te verbeteren.

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

De lock() -methode van de BitmapData-klasse vergrendelt een afbeelding en voorkomt dat objecten die ernaar verwijzen worden bijgewerkt als het BitmapData-object wijzigt. Als een Bitmap-object bijvoorbeeld verwijst naar een BitmapData-object, kunt u het BitmapData-object vergrendelen, wijzigen en ontgrendelen. Het Bitmap-object wordt niet gewijzigd, voordat het BitmapData-object wordt ontgrendeld. Gebruik deze methode met de methode unlock() voor en na verscheidene aanroepen van de methode setPixel() of setPixel32() om de prestaties te verbeteren. Als u lock() en unlock() oproept, wordt het scherm niet onnodig bijgewerkt.

Opmerking: Deze techniek niet altijd tot betere prestaties bij het verwerken van pixels op een bitmap die niet op de weergavelijst staat (dubbele buffering). Als een bitmapobject niet naar de bitmapbuffer verwijst, verbeteren de prestaties niet wanneer u lock() en unlock() gebruikt. Flash Player detecteert dat er niet naar de buffer wordt verwezen en de bitmap niet op het scherm wordt gerenderd.

Methoden die pixelherhalingen uitvoeren, zoals getPixel() , getPixel32() , setPixel() en setPixel32() , werken wellicht vrij langzaam, vooral op mobiele apparatuur. Gebruik, indien mogelijk, methoden die alle pixels in één oproep opvragen. Voor het lezen van pixels gebruikt u de getVector() -methode, die sneller is dan de getPixels() -methode. Gebruik waar mogelijk API's die gebruikmaken van Vector-objecten; deze zijn sneller.