2009-09-25 3 views
4

J'essaie d'utiliser PNGEncoder pour encoder un objet bitmapData dans un png ByteArray afin que je puisse envoyer les données au serveur. Tout serait peachy excepté le bitmapData est 4000x4000px et quand j'exécute la fonction de PNGEncoder.encode là-dessus l'application entière s'arrête (UI est bloquée) pendant 5-8 secondes pendant qu'elle court. Est-ce que quelqu'un a des suggestions sur la façon de ne pas bloquer si mauvais, j'ai lu sur le découpage du processus (puisque vous ne pouvez pas multithread dans AS3), mais ne peux pas trouver un exemple de code sur le découpage du processus.ActionScript PNGEncoder performance et blocage de l'interface utilisateur

Merci, Sam

Répondre

3

Il existe principalement deux façons de procéder.

a) Utiliser la cintreuse de pixels: Vous pouvez charger l'image dans une cintreuse de pixels (une nuance semblable à la couleur dans as3). Cela a l'avantage d'utiliser le gpu dans certains cas, mais il est également assynchrone et non bloquant (s'exécute sur un autre thread). Mais cela nécessite le joueur 10+. Je n'ai pas vu d'encodeur png de pixel bender, et pour être honnête, cela peut ne pas être possible (je ne suis pas assez familier avec l'encodage png pour le dire), mais cela pourrait être une option. C'est, performance sage, le meilleur que vous pouvez obtenir. Plus d'informations here

b) Utilisez le tronçonnage. Fondamentalement, vous réécrivez l'encodeur pour encoder des blocs (lignes, colonnes ou une zone plus petite), et accrochez-le à un événement enter frame, chaque trame que vous appelez prochainement sur votre encodeur, jusqu'à ce qu'il n'y ait plus d'encodage à faire. Zeh a un LWZ chunked encoder soigné avec le code source qui pourrait vous donner un aperçu des détails.

Vive Arthur

+0

note http://theflashblog.com/?p=822 – jedierikb

0

Vous pouvez encoder plusieurs fichiers PNG séparément et les envoyer au serveur. Une fois sur le serveur, vous pouvez reconstruire l'image plus grande.

+0

Je ai réfléchi que sur mais dans ce cas particulier d'utilisation ce n'est pas une option :( – Shizam

4

Outre le commentaire d'Arthur, vous pouvez aussi écrire en C/C++ pour Alchemy, car l'alchimie prend en charge les fils verts. Comme PixelBender, l'alchimie exige aussi de Flash 10.

+0

En fait, la libpng (en C, je pense) est inclus comme un échantillon lorsque vous téléchargez Alchemy –

0

Comme Arthur Debert dit, vous pouvez utiliser Chunking. Je suggère que, au lieu d'encoder une fois/frame, vous essayez une approche setTimeout(chunkingFunction, 0);. Un timeout avec un délai de 0 ms se produira le plus rapidement possible, permettant au traitement de traiter rapidement mais sans écraser l'interface utilisateur.

1

Une autre prise éhontée!

Vous pouvez utiliser ma bibliothèque PNGEncoder2 récemment terminée (nécessite également Flash 10+), qui supporte facilement les images gigantesques. Il effectue un encodage asynchrone approprié, sans aucune étape de compression à la fin. De plus, il est vraiment rapide ;-)

Prenez-le de GitHub (README), et comparez-le benchmark en le comparant avec d'autres encodeurs sur mon blog.

Il est très ajusté pour la vitesse, et utilise les opcodes Alchemy et domain memory pour l'accélérer (grâce à haXe), il devrait donc être comparable à tout ce que vous compilez avec Alchemy.

+0

Très bien, est-ce plus rapide que les encodeurs JPEG asynchrones comme http: // segfaultlabs.com/devlogs/alchemy-asynchrone-jpeg-encodage-2? – sydd

+0

@sydd: Merci! Je n'ai aucune idée de la vitesse de ce codeur JPEG; vous devriez faire un benchmark pour le savoir (ne devrait pas être trop difficile de jeter un ensemble si). Gardez à l'esprit que JPEG est un format complètement différent de PNG; JPEG entraînera probablement des tailles de fichiers beaucoup plus petites, mais ne peut pas encoder le canal alpha, etc. Sachez également qu'il est très difficile d'obtenir un encodage asynchrone rapide en Flash (au moins, il est difficile de l'obtenir * régulièrement * rapidement à travers des systèmes disparates et des charges tout en maintenant un taux de trame) - donc tester les versions de synchronisation séparément. – Cameron