分享免费的编程资源和教程

网站首页 > 技术教程 正文

使用不同的压缩算法提升程序性能

goqiw 2024-11-27 14:00:31 技术教程 27 ℃ 0 评论

程序的性能优化,是一个老生常谈的问题。客户端有客户端的优化手段,服务器有服务器的优化手段。常见的优化手段,百度google一搜一大把,就不在这里说了。今天就来讲一个相比起那些常规优化手段来略显冷门一些的优化手段,客户端可用,服务器也可用,那就是对压缩算法的调整。

压缩也是一种很常见的优化手段。在互联网行业,最常见的压缩算法就是gzip。Gzip的优点,大家十分熟悉,就不在这里赘述了。本文主要是为大家提供一个思路,那就是虽然gzip压缩算法是适用最广的优秀算法,但并不一定在所有场景下都是最优选择,在一些场景下,使用其他压缩算法可以显著提升程序的性能。

下面,就拿作者自身的一次客户端优化经验来举例说明。

做客户端开发的同学或多或少都接触过pvr图像格式,很多同学也都知道,将png图片改成pvr图片可以大幅提升IOS系统下图片的加载效率。作者以前在使用cocos2dx 3.10引擎开发游戏的时候,最初也是使用这些常规手段:对图片进行适当的拆分打包,尽量使启动时加载的图集最少,使用Texture Packer之类的工具将散图打包成图集,导出pvr.ccz合图和plist。然而,这些常规手段动用之后,进入游戏、打开界面的时间就已经被压缩到极限了吗?

其实并没有,精益求精才是我们的追求。

这是cocos2dx-3.10版本的CCImage.cpp的部分源码。有了解cocos2dx源码的同学应该知道,CCImage就是cocos2dx用来管理图片加载的代码,在这段源码中,我们可以看到这样一段代码:

然后,我把这段代码改成了下面这个样子:

效果非常显著,加载单张pvr图片的速度提升了20%~30%。

其实原理也很简单,pvr.ccz格式,其实是pvr图片经过zip压缩后得到的压缩格式。在cocos2dx 3.10加载图片时,会对pvr.ccz中读出的数据流进行一次解压缩操作,作者只不过是在对pvr图片进行打包的时候,将压缩算法改成了Facebook提供的zstd算法,解压处也采取了相应的处理而已。简单的一处修改,就可以将解压缩的时间缩短50%以上,而且Zstd算法还支持字典训练功能,经过字典训练后解压缩速度还可以进一步提升。经过这次调整之后,用户加载资源的速度得到了显著提升,无论是进入游戏还是打开界面时,都可以直接感受出这种提升。

Zstd算法是开源的,原始版本是C语言实现,非常容易嵌入到cocos2dx引擎中,同时它也有其他语言的实现版本,在其官网上都有相应的链接,不仅客户端可以用,服务器也一样可以使用。除了zstd之外,还有其他的一些压缩算法,各有各的优势,在这里我就直接借用一些Facebook自家的测评数据来展示:

在测评中可以看出,从压缩比、压缩和解压缩的速度出发,不同的压缩算法有不同的优势。

例如lz4的压缩比虽然不高,但在速度上的表现无人能及(lz4的宣传卖点也是如此:Extremely Fast Compression algorithm),snappy是google家的产品,压缩比低,速度不错,同样有多种不同语言的跨平台实现。而zstd是Facebook家的产品,综合表现是最平衡的,压缩比与gzip相近,而速度比gzip快得多。根据项目的实际情况,适当采用不同的压缩算法,在遇到性能优化瓶颈时或许也是一项突破的手段。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表