點陣圖影像的非同步解碼

Flash Player 11 以及更新的版本,Adobe AIR 2.6 以及更新的版本

當您使用點陣圖影像時,可以用非同步的方式解碼和載入點陣圖影像,以改善應用程式的認知效能。在許多情況下,以非同步方式解碼點陣圖影像可能需要花費與同步解碼影像相同的時間。不過,點陣圖影像會在關聯的 Loader 物件傳送 COMPLETE 事件之前,在不同的執行緒中解碼。因此,您可以在載入它們後,以非同步方式解碼較大的影像。

flash.system 套件中的 ImageDecodingPolicy 類別,可讓您指定點陣圖載入配置。預設載入配置為同步。

點陣圖解碼原則

點陣圖載入配置

說明

ImageDecodingPolicy.ON_DEMAND

同步

當存取影像資料時會解碼載入的影像。

使用此原則以解碼較小的影像。當您的應用程式不依賴複雜的特效和轉場時,也可以使用此原則。

ImageDecodingPolicy.ON_LOAD

非同步

在傳送 COMPLETE 事件前,會在加載時解碼載入的影像。

適用於較大的影像 (大於 10 MP)。您開發的 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);

您仍然可以透過 Loader.load() Loader.loadBytes() 方法使用 ON_DEMAND 解碼。不過,所有將 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 執行階段中的非同步點陣圖解碼