Asynchroniczne dekodowanie obrazów bitmapowych

Flash Player 11 i nowsze wersje, Adobe AIR 2.6 i nowsze wersje

Podczas pracy z obrazami bitmapowymi można asynchronicznie dekodować i wczytywać obrazy bitmapowe w celu poprawienia postrzeganej wydajności aplikacji. Asynchroniczne dekodowanie obrazu bitmapowego może często trwać równie długo jak dekodowanie synchroniczne. Obraz bitmapowy jest jednak dekodowany w oddzielnym wątku, zanim skojarzony z nim obiekt Loader wyśle zdarzenie COMPLETE . Dzięki temu można asynchronicznie dekodować większe obrazy po ich wczytaniu.

Klasa ImageDecodingPolicy w pakiecie flash.system pozwala określić schemat wczytywania bitmap. Domyślny schemat wczytywania jest synchroniczny.

Zasady dekodowania bitmap

Schemat wczytywania bitmap

Opis

ImageDecodingPolicy.ON_DEMAND

Synchroniczne

Wczytywane obrazy są dekodowane podczas uzyskiwania dostępu do danych obrazów.

Tej zasady należy używać na potrzeby dekodowania mniejszych obrazów. Można ją także stosować, gdy aplikacja nie korzysta ze złożonych efektów ani przejść.

ImageDecodingPolicy.ON_LOAD

Asynchroniczne

Wczytywane obrazy są dekodowane w trakcie wczytywania, przed wywołaniem zdarzenia COMPLETE .

Jest to idealne rozwiązanie w przypadku dużych obrazów (powyżej 10 megapikseli). Podczas programowania aplikacji AIR dla urządzeń przenośnych z przejściami stron warto korzystać z tej zasady wczytywania bitmap, gdyż dzięki temu aplikacja sprawia wrażenie wydajniejszej.

Uwaga: Jeśli wczytywany plik jest obrazem bitmapowym i jest używana zasada dekodowania ON_LOAD , obraz jest dekodowany asynchronicznie przed wywołaniem zdarzenia COMPLETE .

Poniższy kod demonstruje użycie klasy ImageDecodingPolicy .

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

Dekodowania ON_DEMAND można nadal używać z metodami Loader.load() i Loader.loadBytes() . Wszystkie inne metody pobierające obiekt LoaderContext jako argument ignorują przekazaną wartość ImageDecodingPolicy .

Poniższy przykład ilustruje różnicę w dekodowaniu obrazu bitmapy synchronicznie i asynchronicznie.

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

Demonstrację skutków zastosowania różnych zasad dekodowania zawiera artykuł Thibaud Imbert: Asynchroniczne dekodowanie bitmap w środowiskach wykonawczych Adobe Flash .