Asynchrone Dekodierung von Bitmapbildern

Flash Player 11 und höher, Adobe AIR 2.6 und höher

Bei der Arbeit mit Bitmapbildern können Sie die Bitmaps asynchron dekodieren und laden, um die wahrgenommene Leistung Ihrer Anwendung zu verbessern. In vielen Fällen kann das asynchrone Dekodieren der Bitmap genauso viel Zeit in Anspruch nehmen wie das synchrone Dekodieren. Die Bitmap wird jedoch in einem separaten Thread dekodiert, bevor das zugehörige Loader -Objekt das COMPLETE -Ereignis sendet. Deshalb können Sie größere Bilder asynchron dekodieren, nachdem Sie sie geladen haben.

Über die ImageDecodingPolicy -Klasse im flash.system -Paket können Sie das Schema zum Laden der Bitmaps angeben. Das standardmäßige Ladeschema ist synchron.

Richtlinie zum Dekodieren von Bitmaps

Schema zum Laden der Bitmap

Beschreibung

ImageDecodingPolicy.ON_DEMAND

Synchron

Geladene Bilder werden beim Zugriff auf die Bilddaten dekodiert.

Verwenden Sie diese Richtlinie zum Dekodieren von kleineren Bildern. Diese Richtlinie eignet sich auch, wenn Ihre Anwendung keine komplexen Effekte und Übergänge verwendet.

ImageDecodingPolicy.ON_LOAD

Asynchron

Geladene Bilder werden beim Laden und vor dem Auslösen des COMPLETE -Ereignisses dekodiert.

Diese Richtlinie eignet sich ideal für größere Bilder (größer als 10 MP). Wenn Sie AIR-Anwendungen für Mobilgeräte mit Seitenübergängen entwickeln, sollten Sie diese Richtlinie zum Laden von Bitmaps verwenden, um die wahrgenommene Leistung Ihrer Anwendung zu verbessern.

Hinweis: Wenn es sich bei der geladenen Datei um ein Bitmapbild handelt und die Dekodierungsrichtlinie ON_LOAD verwendet wird, wird das Bild asynchron dekodiert, bevor das COMPLETE -Ereignis ausgelöst wird.

Der folgende Code zeigt die Verwendung der ImageDecodingPolicy -Klasse:

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);

Sie können die ON_DEMAND -Kodierung weiterhin mit den Methoden Loader.load() und Loader.loadBytes() verwenden. Alle anderen Methoden, die ein LoaderContext -Objekt als Argument verwenden, ignorieren jedoch den für ImageDecodingPolicy übergebenen Wert.

Das folgende Beispiel veranschaulicht den Unterschied zwischen der synchronen und der asynchronen Dekodierung eines Bitmapbildes.

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"); 
        } 
    } 
}

Eine Demonstration der Auswirkung der verschiedenen Dekodierungsrichtlinien finden Sie unter Thibaud Imbert: Asynchronous bitmap decoding in the Adobe Flash runtimes .