비트맵 이미지를 사용하여 작업하는 경우에 비트맵 이미지를 비동기적으로 디코딩하고 로드하여 응용 프로그램의 인지 성능을 향상시킬 수 있습니다. 비트맵 이미지를 비동기적으로 디코딩하면 대부분의 경우 동기적으로 디코딩할 때와 동일한 시간이 소요될 수 있습니다. 하지만 연결된
Loader
객체에서
COMPLETE
이벤트를 보내기 전에 비트맵 이미지가 별도의 스레드에서 디코딩됩니다. 따라서 큰 이미지는 로드한 후에 비동기적으로 디코딩할 수 있습니다.
flash.system
패키지의
ImageDecodingPolicy
클래스를 사용하면 비트맵 로드 스킴을 지정할 수 있습니다. 로드 스킴의 기본값은 동기 방식입니다.
비트맵 디코딩 정책
|
비트맵 로드 스킴
|
설명
|
ImageDecodingPolicy.ON_DEMAND
|
동기
|
로드된 이미지는 이미지 데이터에 액세스할 때 디코딩됩니다.
이 정책은 작은 이미지를 디코딩할 때 사용합니다. 응용 프로그램에서 복잡한 효과나 전환 효과에 의존하지 않는 경우에도 사용할 수 있습니다.
|
ImageDecodingPolicy.ON_LOAD
|
비동기
|
로드된 이미지는
COMPLETE
이벤트가 전달되기 전에 로드 시 디코딩됩니다.
이 정책은 큰 이미지(10MP 초과)에 사용하는 것이 가장 좋습니다. 페이지 전환 효과가 있는 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 런타임의 비동기 비트맵 디코딩
을 참조하십시오.