概括总结游戏中使用到的各类纹理压缩格式,详解各自的来源和原理。css
图片格式,是图片文件的存储格式,用于图片文件的存储和传输,一般在磁盘文件,内存以及网络传输中使用。android
纹理格式是显卡可以直接进行采样的纹理数据的格式,是向显卡中加载纹理时使用的数据格式。ios
图片格式和纹理格式的关系,就是没有关系。若是图片要传输给显卡使用,则必须转换成显卡可以识别的纹理格式,这个在游戏引擎中,会对应自动转换,也能够经过相关的代码设置显式的转换。算法
常见的图片格式,有 jpg, png, bmp, tga, psd, dds, Gif, 游戏中通常用png, tga两种格式,jpg因为不带透明通道,因此不常被游戏采用。 psd容易作成较大的图,因此也被摒弃。网络
纹理格式,其实就是针对显卡而设置的一些图片的数据格式。将图片加载为纹理的时候,须要将图片格式按照对应的规范解码,通常先解码为原始位图,而后从新编码为须要的纹理格式,固然这个过程引擎已经作好,不须要咱们过多关注。优化
这样的过程,有一个问题,就是加压缩,解码,从新编码压缩的过程比较消耗CPU,若是在游戏总实时的执行这样的一个过程,会出现明显的卡顿掉帧。为了解决这个过程,通常在项目中,在资源导入或者打bundle的时候,会执行相关配套的纹理格式转换,最终打入游戏包或者Bundle中的是已经预先转换好的纹理格式,这样加载的时候优化了解码和转换的过程,可以提升加载速度。这也是为何不一样平台的bundle不能跨平台使用的缘由之一。编码
目前市面上的GPU的四大厂商有:blog
常见的纹理格式有如下几种: R5G6B5, A4R4G4B4, A1R5G5B5, R8G8B8, A8R8G8B8, 总共四种基本纹理格式,游戏
对于一个512 * 512大小的纹理,若是使用R5G6B5的纹理格式,其大小为512 * 512 * 2 = 512KB, 用A8R8G8B8, 就是1M,能够预见,游戏中占用容量最大将是各类纹理,很容易致使游戏安装包突破上G,为了缩小纹理格式的数据占用的内存大小,对应的压缩纹理格式产生了。注意,这不是在移动游戏出现后才产生的,早在PC端游戏时代就有压缩纹理格式。图片
表明性的压缩纹理格式有
ETC1(Ericsson texture compression)这种压缩纹理格式是OpenGL ES的图形标准,被全部的android设备支持,不支持透明通道,每一个像素0.5个字节
PVRTC(PowerVR texture compression)
支持GPU为PowerVR SGX系列,基本的压缩参数有:
RGB_PVRTC_4Bit, RGB, 每一个像素0.5个字节
RGB_PVRTC_2Bit, RGB, 每一个像素0.25个字节
RGBA_PVRTC_4Bit, RGBA, 每一个像素0.5个字节
RGBA_PVRTC_2Bit, RGBA, 每一个像素0.25个字节
ATITC(ATI texture compression) 支持GPU为Qualcomm的Adreno系列, 基本的压缩参数有:
ATC_RGB_AMD, RGB, 每一个像素0.5字节
ATC_RGBA_EXPLICIT_ALPHA_AMD, RGBA, 每一个像素1个字节
ATC_RGBA_INTERPOLATED_ALPHA_AMD, RGBA, 每一个像素1个字节
DXTC(又名S3TC,S3 texture compression) PC上普遍使用,基本的压缩参数有:
RGB_S3TC_DXT1, RGB, 每一个像素0.5个字节
RGBA_S3TC_DXT1, RGBA, 每一个像素0.5个字节
RGBA_S3TC_DXT3, RGBA, 每一个像素1个字节
RGBA_S3TC_DXT5, RGBA,每一个像素1个字节
摘自网上的数据,没有具体的实测,以RGBA32的大小为1,那么各类压缩格式在存储上的大小为(不含ASTC):
RGB PVRTC 4Bits: 0.25
RGB PVRTC 2Bits: 0.13
ARGB PVRTC 4Bits: 0.25
ARGB PVRTC 2Bits: 0.13
RGBA ETC2 4Bits: 0.25
RGBA ETC2 8Bits: 0.25
RGB + 1-bit ALPHA ETC2 8Bits: 0.2
DXT1: 0.3
DXT5: 0.6
ARGB 16Bits: 0.33
ARGB 32Bits: 1
RGB 16Bits: 0.5
RGB 24Bits: 0.85
在内存中的对比,以RGBA32为1,其他压缩纹理格式的内存占用(不含ASTC):
ARGB 32 Bits: 1
ARGB 16 Bits: 0.5
RGB 24 Bits: 0.8
RGB 16 Bits: 0.5
DXT1: 0.125
DXT5:0.25
RGB PVRTC 4Bits: 0.125
RGB PVRTC 2Bits: 0.0625
ARGB PVRTC 4Bits: 0.125
ARGB PVRTC 2Bits: 0.0625
RGBA ETC2 4Bits: 0.125
RGBA ETC2 8Bits: 0.25
RGB+ 1-bit ALPHA ETC2 8Bits: 0.125
目前(日本)市面上ES3.0的占比超过9成,Apple A8占比超过9成,推荐android使用ETC2, ios使用ASTC,或者PVRTC