2013-06-26 3 views
1

Je développe une application iPad avec Adobe Air.AS3 Async Création de bitmap iOS

J'ai toutes mes images chargées dans BitmapData objets lorsque l'application démarre. Ensuite, j'ai seulement besoin de créer des objets Bitmap (qui sont uniquement des conteneurs) pour utiliser les pixels qui sont stockés dans les objets BitmapData.

Cela fonctionne très bien jusqu'à ce que je dois créer un objet Bitmap avec une grande image. L'application ralentit, voire gèle, pendant une seconde.

Comme AS3 est monothread, je ne peux pas déléguer la création Bitmap à un nouveau thread. Aussi, si l'interface utilisateur est gelée, je ne peux pas montrer un fileur décent pour informer l'utilisateur "quelque chose se passe".

Comment pourrais-je résoudre ce problème? Existe-t-il un moyen de créer des objets en parallèle sans affecter les performances de l'interface utilisateur?

Répondre

0

Eh bien, il semble que la réponse était beaucoup plus simple, et Adobe déjà pensé.

http://help.adobe.com/en_US/as3/dev/WS52621785137562065a8e668112d98c8c4df-8000.html

Le problème est que même si les images sont chargées dans BitmapData objets, ils sont Stil pas décodés. C'est pourquoi les images plus grandes prennent un certain temps à être mis dans Bitmap objets.

La solution est aussi simple que d'utiliser une instruction pour forcer le décodage de l'image lorsque les images sont chargées, et non lorsque vous en avez besoin. Ceci est fait en utilisant ImageDecodingPolicy.ON_LOAD.

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); 
+1

Beaucoup plus commun (quoique impropre) façon de faire est d'appeler simplement 'BitmapData.getPixel (0,0)' sur le BitmapData que vous souhaitez charger en mémoire. Cela va décoder les données pour obtenir le pixel (et fonctionnera aussi sur les images intégrées). Sachez que le décodage d'une image charge l'image _uncompressed_ en mémoire. En raison des faibles quantités de RAM que vous pouvez utiliser dans iOS et de la taille de l'exécution, cela peut devenir très rapidement un problème. –

+0

Merci @JoshJanusch Je vais garder un oeil sur la mémoire. Jusqu'à présent, la solution ci-dessus fonctionne à merveille. – Pier

+0

Je suggère fortement d'avoir Adobe Scout. Il vous aidera énormément tout en essayant de surveiller toutes les performances, en particulier la mémoire –

1

Vous pouvez utiliser un worker, son basiquement un fil d'arrière-plan pour AS3, lu sur le sujet ici ASDocs Worker

+0

Je ne sais toujours pas si c'est la bonne réponse, mais merci pour le conseil. – Pier

+0

Eh bien, c'est votre seule chance d'avoir votre propre fil. Vous pouvez également consulter le cadre des tâches http://www.spicefactory.org/spicelib/docs/as3/current/manual/task.php – M4tchB0X3r

+0

Voici plus d'informations sur l'utilisation des threads avec le nouveau https Flascc: // github.com/adobe-flash/crossbridge/wiki/Multithreaded-C---programming-with-the-Adobe-Flash-C---Compiler-(FlasCC) – Pier