Асинхронное раскодирование растровых изображений

Flash Player 11 и более поздних версий, Adobe AIR 2.6 и более поздних версий

При работе с растровыми изображениями для повышения производительности приложения можно выполнять асинхронное раскодирование и загрузку растровых изображений. Во многих случаях асинхронное раскодирование растрового изображения может занимать столько же времени, как и синхронное. Однако раскодировка растрового изображения осуществляется в отдельном потоке, прежде чем связанный объект Loader отправляет событие COMPLETE . Таким образом, асинхронное раскодирование изображений большого размера можно выполнять после их загрузки.

Класс ImageDecodingPolicy в пакете flash.system позволяет указать схему загрузки растрового изображения. По умолчанию установлена синхронная схема загрузки.

Политика раскодировки растровых изображений

Схема загрузки растровых изображений

Описание

ImageDecodingPolicy.ON_DEMAND

Синхронность

Загруженные изображения раскодируются при обращении к их данным.

Данную политику рекомендуется применять для изображений небольшого размера. Кроме того, политику можно использовать, когда приложению не требуется выполнять сложные эффекты и переходы.

ImageDecodingPolicy.ON_LOAD

Асинхронность

Загруженные изображения раскодируются при загрузке до отправки события COMPLETE .

Идеально подходит для изображений большого размера (больше 10 мегапикселов). При разработке приложений для мобильных устройств на базе AIR с переходами страниц использование данной политики загрузки позволит повысить производительность приложения.

Примечание. Если загружается растровое изображение и выбрана политика ON_LOAD , изображение будет раскодировано асинхронно до отправки события COMPLETE .

В примере кода ниже показано использование класса 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);

Схему раскодирования ON_DEMAND можно также использовать с методами Loader.load() и Loader.loadBytes() . Однако все остальные методы, получающие объект LoaderContext в качестве аргумента, будут игнорировать любые переданные значения ImageDecodingPolicy .

Следующий пример показывает отличие между схемами синхронного и асинхронного раскодирования растровых изображений.

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

Эффект от использования различных политик декодирования продемонстрирован на странице Тибо Имбер (Thibaud Imbert). Асинхронное декодирование растровой графики в средах выполнения Adobe Flash