Descodificación asíncrona de imágenes de mapa de bits

Flash Player 11 y posterior, Adobe AIR 2.6 y posterior

Cuando se trabaja con imágenes de mapa de bits, se puede descodificar de forma asíncrona y cargar imágenes de mapa de bits con el fin de mejorar el rendimiento percibido de la aplicación. La descodificación de una imagen de mapa de bits puede tardar el mismo tiempo que de la descodificación sincrónica de imágenes en muchos casos. Sin embargo, la imagen de mapa de bits se descodifica en un subproceso independiente antes de que el objeto Loader asociado envíe el evento COMPLETE . Por lo tanto, es posible descodificar de forma asíncrona imágenes de mayor tamaño tras cargarlas.

La clase ImageDecodingPolicy del paquete flash.system , permite especificar el esquema de carga de mapa de bits. El esquema de carga predeterminado es sincrónico.

Política de descodificación de mapas de bits

Esquema de carga de mapas de bits

Descripción

ImageDecodingPolicy.ON_DEMAND

Sincrónico

Las imágenes cargadas se descodifican cuando se accede a los datos de la imagen.

Utilice esta política para descodificar imágenes más pequeñas. Esta política también se puede utilizar cuando la aplicación no confía en transiciones y efectos complejos.

ImageDecodingPolicy.ON_LOAD

Asincrónico

Las imágenes cargadas se descodifican durante la carta, antes de que se distribuya el evento COMPLETE .

Ideal para imágenes de mayor tamaño (superiores a 10 MP). Cuando desarrolle aplicaciones móviles basadas en AIR con transiciones de página, utilice esta política de carga de mapas de bits para que el rendimiento percibido de la aplicación sea mejor.

Nota: si el archivo que se está cargando es una imagen de mapa de bits y la política de descodificación utilizada es ON_LOAD , la imagen se descodifica de forma asíncrona antes de que se distribuya el evento COMPLETE .

El siguiente código muestra el uso de la clase 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);

Aún se puede utilizar la descodificación ON_DEMAND con los métodos Loader.load() y Loader.loadBytes() . Sin embargo, todos los demás métodos que obtengan un objeto LoaderContext como argumento, omitirán todos los valores ImageDecodingPolicy transmitidos.

En el siguiente ejemplo se muestra la diferencia en la descodificación de una imagen de mapa de bits de forma sincrónica y asíncrona:

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

Para ver una demostración del efecto de las distintas políticas de descodificación, consulte Thibaud Imbert: Asynchronous bitmap decoding in the Adobe Flash runtimes