픽셀을 사용한 작업

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 객체를 잠그고 변경한 다음 잠금을 해제할 수 있습니다. Bitmap 객체는 BitmapData 객체의 잠금이 해제될 때까지 변경되지 않습니다. 성능을 높이려면 setPixel() 또는 setPixel32() 메서드를 여러 차례 호출하기 전과 후에 이 메서드를 unlock() 메서드와 함께 사용합니다. lock() unlock() 호출은 화면이 불필요하게 업데이트되지 않도록 방지합니다.

참고: 표시 목록이 아니라 비트맵에서 픽셀을 처리할 때(이중 버퍼링) 이 기법으로 성능이 향상되지 않는 경우가 있습니다. 비트맵 객체에서 비트맵 버퍼를 참조하지 않는 경우 lock() unlock() 을 사용해도 성능이 향상되지 않습니다. Flash Player는 버퍼가 참조되지 않는지와 비트맵이 화면에 렌더링되지 않는지를 감지합니다.

픽셀을 반복하는 메서드(예: getPixel() , getPixel32() , setPixel() setPixel32() )는 특히 휴대 장치에서 속도가 느려질 수 있습니다. 가능한 경우 한 번의 호출로 모든 픽셀을 가져오는 메서드를 사용하십시오. 픽셀 읽기에는 getPixels() 메서드보다 빠른 getVector() 메서드를 사용합니다. 또한 Vector 객체가 더 빨리 실행될 가능성이 높으므로 가능하면 Vector 객체를 사용하는 API를 사용하는 것이 좋습니다.