Actionscript PNGEncoder性能和UI阻塞

时间:2009-09-25 23:54:49

标签: flex flash multithreading actionscript

我正在尝试使用PNGEncoder将bitmapData对象编码为png ByteArray,以便将数据发送到服务器。除了bitmapData是4000x4000px之外,所有东西都是桃子的,当我在它上面运行PNGEncoder.encode函数时,整个应用程序在运行时停止(UI被阻止)5-8秒。有没有人对如何阻止它如此糟糕有任何建议,我读到了关于分块的过程(因为你不能在AS3中多线程)但是找不到任何示例代码来分块整个过程。

谢谢, 萨姆

6 个答案:

答案 0 :(得分:4)

除了Arthur的评论之外,您还可以使用C / C ++为Alchemy编写它,因为炼金术支持绿色线程。像PixelBender一样,Alchemy也需要Flash 10。

答案 1 :(得分:3)

主要有两种方法可以做到这一点。

a)使用像素弯曲器: 您可以将工作卸载到像素弯曲器(as3中的语言阴影)。这有利于在某些情况下使用gpu,但它也是同步和非阻塞(在另一个线程上运行)。但它确实要求玩家10+。我没有看到像素弯曲png编码器,说实话,它可能是不可能的(我不熟悉png编码告诉),但它可能是一个选项。这是性能方面,你可以得到的最好。更多信息here

b)使用chuncking。基本上,您重写编码器以对块(行,列或较小区域)进行编码,并将其挂接到输入帧事件,即您在编码器上接下来调用的每个帧,直到没有更多编码要做。 Zeh有一个简洁的LWZ chunked encoder源代码,可以让你深入了解细节。

干杯 亚瑟

答案 2 :(得分:1)

另一个无耻的插头!

您可以使用我最近完成的PNGEncoder2库(也需要Flash 10+),它可以轻松支持巨大的图像。它执行适当的异步编码,最后没有单个压缩步骤。此外,它真的很快; - )

从GitHub(README)抓取它,并查看benchmark将其与我博客文章中的其他编码器进行比较。

它高度调整速度,并使用Alchemy操作码和domain memory加快速度(感谢Haxe),所以它应该与使用Alchemy编译的任何内容相媲美。

答案 3 :(得分:0)

您可以单独编码多个PNG文件并将其发送到服务器。一旦在服务器上,您可以重建更大的图像。

答案 4 :(得分:0)

适用于JPEG编码,但应该很有用 - 请查看此帖子http://segfaultlabs.com/blog/post/asynchronous-jpeg-encoding/

答案 5 :(得分:0)

正如Arthur Debert所说,你可以使用分块。我建议您尝试setTimeout( chunkingFunction, 0 );方法而不是编码一次/帧。延迟时间为0 ms的超时将尽快发生,允许分块快速处理,但不会破坏UI。