Работа с пикселами

Нарисуйте пикселы с помощью метода 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

Метод lock() класса BitmapData блокирует изображение и предотвращает обновление объектов, ссылающихся на изображение, при внесении изменений в объект BitmapData. Например, если объект Bitmap ссылается на объект BitmapData, можно заблокировать объект BitmapData, изменить, а затем разблокировать его. Объект Bitmap остается неизменным, пока объект BitmapData не разблокирован. Чтобы повысить производительность, используйте этот метод вместе с методом unlock() до или после многочисленных вызовов метода setPixel() или setPixel32(). Вызов методов lock() и unlock() позволяет предотвратить нецелесообразное обновление экрана.

Примечание. При обработке пикселов растрового изображения, не включенного в список отображения (двойной буферизации), эта техника может не дать результатов. Если растровое изображение не обращается к буферу растровых изображений, использование методов lock() и unlock() не повысит производительность. Проигрыватель Flash Player обнаруживает, что отсутствует ссылка на буфер, и растровое изображение не визуализируется на экране.

Методы с попиксельной итерацией, такие как getPixel(), getPixel32(), setPixel() и setPixel32(), могут работать медленно, особенно на мобильных устройствах. По возможности используйте методы, извлекающие все пикселы одним вызовом. Для чтения пикселов используйте метод getVector(), который работает быстрее метода getPixels(). Кроме того, по возможности используйте API-интерфейсы, которые основаны на объектах Vector, поскольку они работают быстрее.