你是否经常为进入一个自己喜欢的游戏(或场景切换)而看着加载进度条焦急等待!
作为程序员的你是否对此毫无办法:
bmp格式,格式简单解码快速(相当于内存拷贝),但需要占用庞大的磁盘空间,而磁盘速度和内存速度几乎差2个数量级!
jpg格式,文件占用空间很小,但解码很复杂,速度很慢,不支持alpha通道; 为了优化解码速度,针对CPU特殊指令集开发优化的特殊解码器版本,或专门开发用GPU解码的版本,还是寄希望于运行的环境有硬件解码器?
png格式,文件占用空间中等,无损压缩,支持alpha通道; 但解码速度很慢;
有没有同时考虑文件大小和解码速度而设计的图像文件格式吗?
在3D游戏领域产生了一些类似目的的资源图像格式,比如: S3TC(DXTC),FXT1,ASTC等 (当然,节省显存可能是更重要的设计目的)
它们一般压缩率固定,图像格式简单,编解码快速(应用时甚至不需要解压); 缺点是压缩率中等,压缩质量无法控制,很多种类的图像压缩后质量损失过大,在精美的图像和2D应用中较少采用;
能不能设计一种质量可控,文件占用较小,而又能快速解码的图像格式呢?
这正是FRG("Fast Read Graphics" or "Fast Resource Graphics")的设计目的;FRG的设计目的不是为了增加一种通用的图像交换格式(google的webp到现在都很难做到); 它只完成它的设计目标所要求的事,它不是面向最终用户的,它应该只存在于发布包的资源里;
FRG是一种优化从磁盘加载和解码到显示需要的时间的图像文件格式;(性能测试: http://blog.csdn.net/housisong/article/details/9071113 );
FRG支持无损压缩,也支持有质量损失的压缩,支持32bitARGB颜色(当前的实现Alpha通道始终无损压缩); FRG的使用场景: 需要为资源图像文件减少大小,又要求能够快速解码显示,编码好的文件一般随应用程序发布,而不太在意编码时的时间和内存空间占用;
试试FRG,让你的游戏和应用加载不再需要用户等待!
图像文件格式和其文件大小(无损情况下):
bmp(ARGB32bit) : 481,654 Bytes
png : 121,363 Bytes
jpg(100 quality) : 94,696 Bytes(no alpha)
jpg2000(100 quality) : 117,796 Bytes
tiff(LZW) : 211,980 Bytes
frg(100 quality)(0 size): 182,865 Bytes
FRG有损压缩下的文件:
frg(90 quality)(0 size): 102,541 Bytes frg(80 quality)(0 size): 66,659 Bytes
frg(75 quality)(0 size): 40,982 Bytes
(更多压缩质量展示:http://blog.csdn.net/housisong/article/details/9068535 )
演示程序和源代码:
演示程序:
我提供了windows\macosx\linux系统下的命令行程序,(我没有发布macosx\linux下程序的经验,本机上试过,但不知道能否在别的电脑上执行;) 程序提供了png和frg之间的相互转换功能(注意不要把你的png图片覆盖了)。
演示程序下载: https://github.com/sisong/png2frg_app/archive/master.zip
FRG源代码:
FRG使用非常自由的MIT开源授权协议;
项目地址: https://github.com/sisong/libfrg
欢迎使用和给该项目贡献你的代码!
(编码技术介绍:http://blog.csdn.net/housisong/article/details/9078301 )
(有些有趣的特性支持也在进一步考虑中: 比如一种更友好的内存或显存中的压缩格式\更好的编码质量和大小控制能力\更多输出颜色格式的直接支持?\新的最终用户级编码器\支持感兴趣区域使用更高质量参数\等)