Actionscript PNGEncoder性能和UI阻塞

问题描述 投票:4回答:6

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

谢谢,山姆

flex flash multithreading actionscript
6个回答
3
投票

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

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

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

干杯亚瑟


4
投票

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


1
投票

另一个无耻的插头!

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

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

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


0
投票

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


0
投票

这是JPEG编码,但应该是有用的 - 看看这篇文章http://segfaultlabs.com/blog/post/asynchronous-jpeg-encoding/


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.