Bei der Arbeit mit Bitmapbildern können Sie die Bitmaps asynchron dekodieren und laden, um die wahrgenommene Leistung Ihrer Anwendung zu verbessern. In vielen Fällen kann das asynchrone Dekodieren der Bitmap genauso viel Zeit in Anspruch nehmen wie das synchrone Dekodieren. Die Bitmap wird jedoch in einem separaten Thread dekodiert, bevor das zugehörige
Loader
-Objekt das
COMPLETE
-Ereignis sendet. Deshalb können Sie größere Bilder asynchron dekodieren, nachdem Sie sie geladen haben.
Über die
ImageDecodingPolicy
-Klasse im
flash.system
-Paket können Sie das Schema zum Laden der Bitmaps angeben. Das standardmäßige Ladeschema ist synchron.
Richtlinie zum Dekodieren von Bitmaps
|
Schema zum Laden der Bitmap
|
Beschreibung
|
ImageDecodingPolicy.ON_DEMAND
|
Synchron
|
Geladene Bilder werden beim Zugriff auf die Bilddaten dekodiert.
Verwenden Sie diese Richtlinie zum Dekodieren von kleineren Bildern. Diese Richtlinie eignet sich auch, wenn Ihre Anwendung keine komplexen Effekte und Übergänge verwendet.
|
ImageDecodingPolicy.ON_LOAD
|
Asynchron
|
Geladene Bilder werden beim Laden und vor dem Auslösen des
COMPLETE
-Ereignisses dekodiert.
Diese Richtlinie eignet sich ideal für größere Bilder (größer als 10 MP). Wenn Sie AIR-Anwendungen für Mobilgeräte mit Seitenübergängen entwickeln, sollten Sie diese Richtlinie zum Laden von Bitmaps verwenden, um die wahrgenommene Leistung Ihrer Anwendung zu verbessern.
|
Hinweis:
Wenn es sich bei der geladenen Datei um ein Bitmapbild handelt und die Dekodierungsrichtlinie
ON_LOAD
verwendet wird, wird das Bild asynchron dekodiert, bevor das
COMPLETE
-Ereignis ausgelöst wird.
Der folgende Code zeigt die Verwendung der
ImageDecodingPolicy
-Klasse:
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);
Sie können die
ON_DEMAND
-Kodierung weiterhin mit den Methoden
Loader.load()
und
Loader.loadBytes()
verwenden. Alle anderen Methoden, die ein
LoaderContext
-Objekt als Argument verwenden, ignorieren jedoch den für
ImageDecodingPolicy
übergebenen Wert.
Das folgende Beispiel veranschaulicht den Unterschied zwischen der synchronen und der asynchronen Dekodierung eines Bitmapbildes.
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");
}
}
}
Eine Demonstration der Auswirkung der verschiedenen Dekodierungsrichtlinien finden Sie unter
Thibaud Imbert: Asynchronous bitmap decoding in the Adobe Flash runtimes
.