Podczas pracy z obrazami bitmapowymi można asynchronicznie dekodować i wczytywać obrazy bitmapowe w celu poprawienia postrzeganej wydajności aplikacji. Asynchroniczne dekodowanie obrazu bitmapowego może często trwać równie długo jak dekodowanie synchroniczne. Obraz bitmapowy jest jednak dekodowany w oddzielnym wątku, zanim skojarzony z nim obiekt
Loader
wyśle zdarzenie
COMPLETE
. Dzięki temu można asynchronicznie dekodować większe obrazy po ich wczytaniu.
Klasa
ImageDecodingPolicy
w pakiecie
flash.system
pozwala określić schemat wczytywania bitmap. Domyślny schemat wczytywania jest synchroniczny.
Zasady dekodowania bitmap
|
Schemat wczytywania bitmap
|
Opis
|
ImageDecodingPolicy.ON_DEMAND
|
Synchroniczne
|
Wczytywane obrazy są dekodowane podczas uzyskiwania dostępu do danych obrazów.
Tej zasady należy używać na potrzeby dekodowania mniejszych obrazów. Można ją także stosować, gdy aplikacja nie korzysta ze złożonych efektów ani przejść.
|
ImageDecodingPolicy.ON_LOAD
|
Asynchroniczne
|
Wczytywane obrazy są dekodowane w trakcie wczytywania, przed wywołaniem zdarzenia
COMPLETE
.
Jest to idealne rozwiązanie w przypadku dużych obrazów (powyżej 10 megapikseli). Podczas programowania aplikacji AIR dla urządzeń przenośnych z przejściami stron warto korzystać z tej zasady wczytywania bitmap, gdyż dzięki temu aplikacja sprawia wrażenie wydajniejszej.
|
Uwaga:
Jeśli wczytywany plik jest obrazem bitmapowym i jest używana zasada dekodowania
ON_LOAD
, obraz jest dekodowany asynchronicznie przed wywołaniem zdarzenia
COMPLETE
.
Poniższy kod demonstruje użycie klasy
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);
Dekodowania
ON_DEMAND
można nadal używać z metodami
Loader.load()
i
Loader.loadBytes()
. Wszystkie inne metody pobierające obiekt
LoaderContext
jako argument ignorują przekazaną wartość
ImageDecodingPolicy
.
Poniższy przykład ilustruje różnicę w dekodowaniu obrazu bitmapy synchronicznie i asynchronicznie.
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");
}
}
}
Demonstrację skutków zastosowania różnych zasad dekodowania zawiera artykuł
Thibaud Imbert: Asynchroniczne dekodowanie bitmap w środowiskach wykonawczych Adobe Flash
.