手游中的纹理压缩
下面这篇文章给大家分享的是手游中的纹理压缩,都知道移动设备内存有限,为了节省内存,一般都会对贴图进行压缩。
一张4MB的贴图,在移动设备中压缩之后只有1/8,也就是0.5MB。
假如有一张1024px * 1024px的4通道(RGBA8888,每个通道都为8bit)贴图。
一般来说,一张纹理所占用的内存的计算方式为长乘以框再撑每个像素的比特数,计算公式日下:
内存 = 长 * 宽 * 像素比特数
那么这张图所长的内存为:1024 * 1024 * 4 * 8 bit = 1024 * 1024 * 4 Byte = 4MB
即一个像素占 32bit == 4Byte。
Android设备中一般使用ETC1压缩,一种有损的图像压缩方式。
ETC1是OpenGL2.0支持的标准,压缩之后每个像素占4bit,压缩之后的格式为KTX或者PKM,前者支持存储多纹理,后者只支持单纹理。
上面的图片压缩之后的大小为:1024 * 1024 * 4 bit = 0.5MB
ETC1的缺点是不支持Alpha通道,不支持有透明度的图片压缩。
ETC2解决了Alpha通道,但是它是OpenGL3.0标准,考虑到2.0设备的市场占有率,一般使用ETC1。
ETC1压缩Alpha通道解决方案
一种alpha贴图:是将alpha通道扩展到原图的下方,形成一个和原图一样大小的区域来表示原图中的alpha信息,对于PKM和KTX可以使用这种方式;
另一种方法是将alpha信息写入KTX的meta信息中,在读入内存时,从meta中取出alpha信息,生成一张与原图一样大小的A8纹理,两种方式都会增加一倍的内存占用,所以经过扩展的ETC1每像素大约会占8bit的内存。
iOS设备中采用的图像格式一般是PVR,也是一种有损的图像压缩方式。
PVR压缩分为两种,PVRTC2和PVRTC4。
PVRTC4:Compressed format, 4 bits per pixel, ok image quality
PVRTC2:Compressed format, 2 bits per pixel, poor image quality
常用的PVRTC4,压缩之后的大小为:1024 * 1024 * 4 bit = 0.5MB
除了压缩内存,PVR可以直接被显卡读取,载入速度更快;缺点是PVR需要PowerVR芯片支持,目前iOS设备都能完美支持,Android支持尚少;此外,PVRTC4只支持方形贴图,非方形会被处理成方形,且长宽必须为2的幂。
关于PVR压缩算法可以参考:http://web.onetel.net.uk/~simonnihal/assorted3d/fenney03texcomp.pdf
无论图片存储的是什么格式,在内存中引擎使用时都会是RGBA8888。