自定义DEFLATE实现以加快PNG编码

3
我正在优化一个PNG编码器,用于Flash SWFs(但我是用Haxe编写的)。
到目前为止,我已经通过使用快速内存读/写成功地加速了一些事情。
在对我的代码进行分析时,我注意到约75%的时间都花费在单个调用Flash内置的compress()方法上,该方法使用zlib算法(转而使用DEFLATE)。
我不太在意压缩比,但更快的压缩会很棒。因此,我想知道是否值得尝试自己实现zlib / DEFLATE。一些搜索已经找到了zlib C实现源代码,但它并不是轻松阅读(或易于移植!)。

有没有一些简单的zlib/DEFLATE实现,我可以用作起点?我不想深入研究两个 规范,特别是因为我不知道在AVM2中运行的实现是否能够像原生Flash实现一样快。

3个回答

3

我认为使用非本地的压缩算法不会使性能更好。但是,您可以尝试以异步方式运行它,这可能会产生差异。如果您想进行移植,最好找到一个AS3或JavaScript实现,例如https://github.com/dankogai/js-deflate。祝你好运!


1
这里似乎有一个用haXe编写的Inflate算法,可以在http://code.google.com/p/hxformat/source/browse/trunk/format/tools/InflateImpl.hx找到。 - Waneck
谢谢Waneck,我会看一下那些的。HaXe的解压缩很有趣,但我只需要压缩;-) - Cameron
@Cameron 哦,明白了:)这里似乎有一个针对as3的zlib端口http://code.google.com/p/as3zlib/。我没有深入研究过,但它似乎是从头开始实现整个东西。它可能会表现得最差,但是您可以每个ENTER_FRAME计算一部分,以便它不会挂起应用程序。干杯! - Waneck
@Waneck:哦,这应该很有用。在阅读作者的评论后,我意识到Flash的compress()并没有使用deflate,而是使用zlib,而zlib又使用deflate(PNG规范指出压缩应该是zlib格式)。所以,我仍然需要实现deflate,但我一直忽略了zlib;-) - Cameron
zlib 格式只是 deflate 格式的简单包装器。因此,如果您可以进行压缩并能够计算 Adler32 校验和(这很容易),则具备了 zlib 格式。 - Paŭlo Ebermann
@Waneck:+1,谢谢!我终于完成了我的实现,最终是从头开始做的,它的性能与Adobe使用的本地代码相当(当然,总有取舍),但我的实现专门针对PNG数据,这种数据往往高度冗余。我还支持异步编码。请查看我的答案以获取更多详细信息。 - Cameron

3
我最终从零开始实现了deflate/zlib算法,并在GitHub上发布了它以及构建在其之上的PNG编码器(README)。我还写了一篇关于PNG编码器的博客文章,其中包括一个基准测试,将其与其他编码器进行比较。
压缩实现包含在DeflateStream.hx中,并且成功显著加快了编码过程的速度(并允许将其完全异步化)。

1

谢谢,但这两个都使用Flash内置的deflate()/compress()方法进行实际压缩。 - Cameron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接