När du arbetar med bitmappsbilder kan du avkoda och läsa in dem asynkront för att förbättra programmets upplevda prestanda. I många fall tar det lika lång tid att avkoda en bitmapp asynkront som synkront. Men bitmappsbilden avkodas i en separat tråd innan det associerade
Loader
-objektet skickar
COMPLETE
-händelsen. Du kan således avkoda större bilder asynkront efter att de lästs in.
Med klassen
ImageDecodingPolicy
i paketet
flash.system
kan du ange inläsningsschema för bitmappar. Standardinläsningschemat är synkront.
Avkodningsprincip för bitmappar
|
Inläsningsschema för bitmappar
|
Beskrivning
|
ImageDecodingPolicy.ON_DEMAND
|
Synkron
|
Inlästa bilder avkodas vid åtkomst av bilddata.
Använd den här principen för att avkoda mindre bilder. Du kan också använda den här principen om programmet inte innehåller komplexa effekter och övergångar.
|
ImageDecodingPolicy.ON_LOAD
|
Asynkron
|
Inlästa bilder avkodas vid inläsning, innan händelsen
COMPLETE
skickas.
Praktiskt för större bilder (större än 10 MP). När du utvecklar AIR-baserade mobilprogram med sidövergångar använder du den här inläsningsprincipen för bitmappar för att förbättra programmets upplevda prestanda.
|
Obs!
Om den fil som läses in är en bitmappsbild, och avkodningsprincipen är
ON_LOAD
, avkodas bilden asynkront innan
COMPLETE
-händelsen skickas.
Följande kod visar hur klassen
ImageDecodingPolicy
används:
var loaderContext:LoaderContext = new LoaderContext();
loaderContext.imageDecodingPolicy = ImageDecodingPolicy.ON_LOAD
var loader:Loader = new Loader();
loader.load(new URLRequest("http://www.adobe.com/myimage.png"), loaderContext);
Du kan fortfarande använda
ON_DEMAND
-avkodning med metoderna
Loader.load()
och
Loader.loadBytes()
. Alla andra metoder som får ett
LoaderContext
-objekt som argument kommer dock att ignorera alla
ImageDecodingPolicy
-värden som skickas.
Följande exempel visar skillnaden mellan att avkoda en bitmappsbild asynkront och synkront:
package
{
import flash.display.Loader;
import flash.display.Sprite;
import flash.events.Event;
import flash.net.URLRequest;
import flash.system.ImageDecodingPolicy;
import flash.system.LoaderContext;
public class AsyncTest extends Sprite
{
private var loaderContext:LoaderContext;
private var loader:Loader;
private var urlRequest:URLRequest;
public function AsyncTest()
{
//Load the image synchronously
loaderContext = new LoaderContext();
//Default behavior.
loaderContext.imageDecodingPolicy = ImageDecodingPolicy.ON_DEMAND;
loader = new Loader();
loadImageSync();
//Load the image asynchronously
loaderContext = new LoaderContext();
loaderContext.imageDecodingPolicy = ImageDecodingPolicy.ON_LOAD;
loader = new Loader();
loadImageASync();
}
private function loadImageASync():void{
trace("Loading image asynchronously...");
urlRequest = new URLRequest("http://www.adobe.com/myimage.png");
urlRequest.useCache = false;
loader.load(urlRequest, loaderContext);
loader.contentLoaderInfo.addEventListener
(Event.COMPLETE, onAsyncLoadComplete);
}
private function onAsyncLoadComplete(event:Event):void{
trace("Async. Image Load Complete");
}
private function loadImageSync():void{
trace("Loading image synchronously...");
urlRequest = new URLRequest("http://www.adobe.com/myimage.png");
urlRequest.useCache = false;
loader.load(urlRequest, loaderContext);
loader.contentLoaderInfo.addEventListener
(Event.COMPLETE, onSyncLoadComplete);
}
private function onSyncLoadComplete(event:Event):void{
trace("Sync. Image Load Complete");
}
}
}
Om du vill se en demonstration av effekten av olika avkodningsprinciper ska du besöka
Thibaud Imbert: Asynchronous bitmap decoding in the Adobe Flash runtimes