ピクセルの操作

ピクセルのペイントには 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(9getPixel32()setPixel()setPixel32() など、ピクセルで繰り返されるメソッドは、特に低速になる可能性があります(特にモバイルデバイス上)。可能な場合は、1 回の呼び出しですべてのピクセルを取得するメソッドを使用します。ピクセルの読み込みには、getVector() メソッドを使用します。このメソッドは getPixels() メソッドよりも高速です。また、可能な場合は、Vector オブジェクトに依存している API を使用します。これにより、処理が高速化されます。