비트맵 이미지의 비동기 디코딩

Flash Player 11 이상, Adobe AIR 2.6 이상

비트맵 이미지를 사용하여 작업하는 경우에 비트맵 이미지를 비동기적으로 디코딩하고 로드하여 응용 프로그램의 인지 성능을 향상시킬 수 있습니다. 비트맵 이미지를 비동기적으로 디코딩하면 대부분의 경우 동기적으로 디코딩할 때와 동일한 시간이 소요될 수 있습니다. 하지만 연결된 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 런타임의 비동기 비트맵 디코딩 을 참조하십시오.