При работе с растровыми изображениями для повышения производительности приложения можно выполнять асинхронное раскодирование и загрузку растровых изображений. Во многих случаях асинхронное раскодирование растрового изображения может занимать столько же времени, как и синхронное. Однако раскодировка растрового изображения осуществляется в отдельном потоке, прежде чем связанный объект
Loader
отправляет событие
COMPLETE
. Таким образом, асинхронное раскодирование изображений большого размера можно выполнять после их загрузки.
Класс
ImageDecodingPolicy
в пакете
flash.system
позволяет указать схему загрузки растрового изображения. По умолчанию установлена синхронная схема загрузки.
Политика раскодировки растровых изображений
|
Схема загрузки растровых изображений
|
Описание
|
ImageDecodingPolicy.ON_DEMAND
|
Синхронность
|
Загруженные изображения раскодируются при обращении к их данным.
Данную политику рекомендуется применять для изображений небольшого размера. Кроме того, политику можно использовать, когда приложению не требуется выполнять сложные эффекты и переходы.
|
ImageDecodingPolicy.ON_LOAD
|
Асинхронность
|
Загруженные изображения раскодируются при загрузке до отправки события
COMPLETE
.
Идеально подходит для изображений большого размера (больше 10 мегапикселов). При разработке приложений для мобильных устройств на базе 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