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