如何在质量下降不大的情况下降低一倍的占用?如何让臃肿的美术资源压缩再压缩?
JPEG->WDP/WEBP
大部分项目都陆续废掉了JPEG,而最好的代替品是微软的HD Photo,wdp格式,在PSNR差不多的情况下,wdp能比JPEG小一倍多。
(wdp的encoder/decoder不好找的话,我这里有一份微软的库)
观察下面的演示图片不要缩放PDF,用100%显示才看得清楚差别
JPEG 16.18 KB,可以看出脸部方块已经很严重,头发等高频部分已经看不清楚,帽子和墙面质量损失严重,而下面这张WDP文件(HDPHOTO,XnView可以转换)只有13.85KB大小,质量却比JPEG好很多。(通常情况下峰值信噪比差不多的话,WDP能够小一倍):
压缩比从强到弱依次是:WDP>WEBP>JPEG2000>JPEG。因此换用WDP格式能缩小不少资源。
PNG->WEBP
非界面元素,仅仅是为了使用ARGB32的资源,可以用webp的带alpha有损格式代替,能节省不少。
实时纹理压缩
PS Vita里面已经大范围用到了实时纹理压缩方法,DXT格式存储纹理仅仅是为了方便显卡,但是它的地压缩率却害苦了硬盘。废除DXT格式,用wdp格式或者webp格式有损保存图片(不要用JPEG了,JPEG太差)。运行时动态载入并且动态生成dxt格式再载入显卡。如此在质量微弱损失的情况下,可以至少获得4-5倍的空间节省。
PS Vita使用的动态生成dxt的库叫:
一般用作模型纹理,UI这种单调,锐利的图片,还是PNG好点。这种方法对风景,人物等纹理的压缩效果最佳。(也可以把转换工作放到安装/更新后,只转一次)。
DDS格式 256.13KB
WDP高质量 49.61KB
WDP低质量:13.85KB
图片格式
图片大小
原始图片BMP24BITS
786KB
DDS
256KB
WDP高质量
49KB
WDP低质量
13KB
JPEG低于“WDP低质量”的质量
16KB
MIPMAP整合
结合前面动态生成DXT格式,dds里面一般有很多mipmap,按照下面组织原理把这些mipmap全部整合到一张HD Photo图片上。各个子图片元素大致相同,一次性压缩能获得更好效果。
当需要还原时再将其切割,并转换回DDS格式。
MIPMAP实时生成
虽然物体远近可以用不同的mipmap来提供更真实的效果,但是mipmap的制作上,很多却是先画一张高解析度的图,然后用BOX/BICUBIC等方法缩小出若干张来。负责任点的才会再稍加修改。
显卡的BILINEAR采样绘制对于需要将图片缩小显示的效果比BICUBIC差很多,甚至不如BOX方法。所以很多就是提前用BICUBIC生成缩小后的图片作为一组mipmap存到dds。
这样还不如运行时实时用BICUBIC从最高清的那张纹理自动生成mipmap,再组装成dds载入显卡。可以发现效果和原来的差不多,而容量足足少了一倍。
H264保存纹理动画
H264的2PASS方式保存纹理动画的各帧数据,alpha单独用无损格式保存。
抛弃ZLIB换用LZMA2
换用LZMA2能够高于zlib差不多25%的压缩率(LZMA1只有18%左右)。现在Linux内核压缩文件已经从bz2改为 LZMA2的xz格式了。