Rita pixlar med metoden
setVector()
.
När du ritar pixlar kan du göra några enkla optimeringar bara genom att använda lämpliga metoder i klassen BitmapData. Ett snabbt sätt att rita pixlar är att använda metoden
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 );
När du använder långsamma metoder såsom
setPixel()
eller
setPixel32()
, ska du använda metoderna
lock()
och
unlock()
för att få förloppen att gå snabbare. I följande kod används metoderna
lock(
) och
unlock()
för att förbättra prestandan:
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
Metoden
lock()
i BitmapData-klassen används för att låsa en bild och förhindra att objekt som refererar till den uppdateras när BitmapData-objektet ändras. Om till exempel ett bitmappsobjekt refererar till ett BitmapData-objekt, kan du låsa BitmapData-objektet, ändra det och sedan låsa upp det. Bitmappsobjekt ändras inte förrän BitmapData-objektet är upplåst. Använd den här metoden tillsammans med
unlock()
-metoden före och efter flera anrop till
setPixel()
- eller
setPixel32()
-metoden för att få bättre prestanda. Genom att
lock()
och
unlock()
kommer skärmen inte att uppdateras i onödan.
Obs!
När pixlar bearbetas på en bitmapp, inte på visningslistan (dubbel buffring), kan detta ibland innebära att prestandan inte förbättras. Om ett bitmappsobjekt inte refererar bitmappsbufferten, kommer du inte att förbättra prestandan genom att använda
lock()
och
unlock()
. I Flash Player upptäcks att bufferten inte refereras och bitmappen kommer inte att återges på skärmen.
Metoder som itererar över pixlar, till exempel
getPixel()
,
getPixel32()
,
setPixel()
och
setPixel32()
, kommer troligtvis att vara långsamma. Detta gäller speciellt för mobila enheter. Du ska om möjligt använda metoder som hämtar alla pixlar i ett anrop. När du vill läsa pixlar ska du använda metoden
getVector()
som är snabbare än metoden
getPixels()
. Tänk även på att använda API:er som förlitar sig på vektorobjekt när det är möjligt, eftersom de troligtvis körs snabbare.