使用像素

使用 setVector() 方法繪製像素。

繪製像素時,可以使用 BitmapData 類別的適當方法來建立一些簡單的最佳化。繪製像素的快速方式是使用 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 );

使用緩慢的方法 (例如 setPixel() setPixel32() ) 時,請使用 lock() unlock() 方法,讓執行的速度變得更快。在下列程式碼中,使用 lock() unlock() 方法來改善效能:

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

BitmapData 類別的 lock() 方法會鎖定影像,並防止參考它的物件在 BitmapData 物件變更時進行更新。例如,如果 Bitmap 物件參照 BitmapData 物件,您可以鎖定 BitmapData 物件、變更它,然後將它解除鎖定。在解除鎖定 BitmapData 物件之前,不會變更 Bitmap 物件。若要改善效能,請在您多次呼叫 setPixel() setPixel32() 方法之前與之後,將此方法與 unlock() 方法搭配使用。呼叫 lock() unlock() 可避免不必要地更新螢幕。

備註: 處理不在顯示清單上的點陣圖像素 (雙重緩衝) 時,此技巧有時並無法改善效能。如果點陣圖物件不是參考點陣圖緩衝區,則使用 lock() unlock() 便不會改進效能。Flash Player 會偵測是否未參考緩衝區,以及螢幕上是否未顯示點陣圖。

重複使用像素的方法 (例如 getPixel() getPixel32() setPixel() 以及 setPixel32() ) 通常速度較慢,特別是在行動裝置上。如有可能,請使用可利用一個呼叫擷取所有像素的方法。若要讀取像素,請使用 getVector() 方法,這個方法的速度比 getPixels() 方法快。另外,請記得盡可能使用 Vector 物件的 API,因為此 API 的執行速度更快。