ビットマップイメージの非同期デコード

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:Asynchronous bitmap decoding in the Adobe Flash runtimes を参照してください。