Asynkron avkodning av bitmappsbilder

Flash Player 11 och senare, Adobe AIR 2.6 och senare

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