ビットマップイメージの操作時に、ビットマップイメージの非同期デコードおよびロードを実行して、アプリケーションの体感的なパフォーマンスを向上できます。ビットマップイメージの非同期デコードにかかる時間は、多くの場合は同期デコードと同様です。しかしながら、ビットマップイメージの非同期デコードは別のスレッドで実行され、その後、関連付けられた
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
を参照してください。