我正在尝试使用PNGEncoder将bitmapData对象编码为png ByteArray,以便将数据发送到服务器。除了bitmapData为4000 x4000 px之外,一切都很顺利,当我在其上运行PNGEncoder.encode函数时,整个应用程序都停止了(UI被阻塞)在运行时持续5-8秒钟。有没有人有什么建议可以让它不会阻塞得这么糟糕,我读到了关于将进程分块的内容(因为在AS 3中不能多线程化),但是找不到任何关于将进程分块的示例代码。
谢谢你,山姆
我正在尝试使用PNGEncoder将bitmapData对象编码为png ByteArray,以便将数据发送到服务器。除了bitmapData为4000 x4000 px之外,一切都很顺利,当我在其上运行PNGEncoder.encode函数时,整个应用程序都停止了(UI被阻塞)在运行时持续5-8秒钟。有没有人有什么建议可以让它不会阻塞得这么糟糕,我读到了关于将进程分块的内容(因为在AS 3中不能多线程化),但是找不到任何关于将进程分块的示例代码。
谢谢你,山姆
6条答案
按热度按时间v9tzhpje1#
除了亚瑟的注解之外,你也可以用C/C++编写Alchemy,因为Alchemy支持绿色线程。像PixelBender一样,Alchemy也需要Flash 10。
qgzx9mmu2#
主要有两种方法来做到这一点。
a)使用像素弯曲器:你可以把工作转移到像素折弯机上(一种类似于as3中的着色语言)。这在某些情况下具有使用gpu的优势,但它也是异步的和非阻塞的。(在另一个线程上运行)。但它确实需要玩家10+。我还没有见过像素弯曲png编码器,老实说,这可能是不可能的(我对png编码还不太熟悉,所以不好说),但这可能是一个选择。这是,性能方面,你能得到的最好的。更多信息here
B)使用分块。基本上,你重写编码器来编码块(行、列或更小的区域),并将其与一个enter frame事件挂钩,每一帧你都将在编码器上调用下一帧,直到没有更多的编码要做。Zeh有一个整洁的LWZ chunked encoder源代码,可能会给予你深入了解细节。
亚瑟
ruyhziif3#
又是一个无耻的塞子!
你可以使用我最近完成的PNGEncoder 2库(也需要Flash 10+),它可以轻松地支持巨大的图像。它可以进行适当的异步编码,在最后没有单一的压缩步骤。此外,它真的很快;- )
从GitHub(README)中获取它,并在我的博客文章中查看它与其他编码器的基准比较。
它在速度上进行了高度优化,并使用Alchemy操作码和domain memory来加速(多亏了Haxe),因此它应该可以与使用Alchemy编译的任何东西相媲美。
dgjrabp24#
您可以分别对多个PNG文件进行编码,然后将它们发送到服务器。一旦到达服务器,您就可以重建更大的图像。
gupuwyp25#
这是JPEG编码,但应该是有用的-看这篇文章http://segfaultlabs.com/blog/post/asynchronous-jpeg-encoding/
mrphzbgm6#
正如亚瑟德贝尔所说,你可以使用分块。我建议你尝试
setTimeout( chunkingFunction, 0 );
方法,而不是每帧编码一次。一个0毫秒延迟的超时将尽快发生,允许分块快速处理,但不会破坏UI。