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

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