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를 사용하는 것이 좋습니다.