移动端纹理压缩格式
设备资源的限制和制作过程中对表现的无限追求永远是矛盾点,不会随设备的发展而转移。纹理压缩就是这种矛盾的一种解决方式,不同于png、jgp这种硬盘压缩方式而言,DXT,ETC等纹理压缩方式可以在游戏运行中无需CPU解压就被GPU直接采样,可以极大的减少内存和带宽的占用,提升运行效率,对移动游戏而言更是如此。
这篇文章做一些简要概述,详细纹理压缩算法需要查阅更详细文档。
非压缩格式
格式 | 内存消耗 (bytes/pixel) | 描述 |
---|---|---|
RGBA8888(RGBA32) | 4bpp | RGBA通道各占用8位 |
RGBA4444(RGBA16) | 2bpp | 每个像素2字节 |
RGB888(RGB24) | 3bpp | 每个像素3字节,RGB通道各占用8位,无透明通道 |
RGB565(RGB16) | 2bpp | 每个像素2字节,RGB通道各占用5/6/5位,无透明通道 |
压缩格式
格式 | 压缩比 | GPU支持 | 描述 | 图片要求 |
---|---|---|---|---|
DXT | DXT1:0.3/DXT5:0.6 | Windows\Android(Nvidia Tegra and Intel Bay Trail) | 分为DXT1-DXT5这五个级别,DXT1 适用于不具有透明度或者仅具有一位Alpha的贴图,DXT3和DX5支持包含4位alpha通道的RGB纹理 | 无 |
ATC RGBA/RGB | RGBA:0.25/RGB:0.125 | Qualcomm -Adreno | 高通GPU支持格式,支持带有Alpha的RGB纹理压缩。 | 无 |
PVRTC RGBA/RGB | 2bit:0.125/4bit:0.25 | PowerVR | IOS平台都支持,支持每个像素2位或者4位的纹理,包含或者不包含alpha通道都可以;PVRTC 2-bpp把一个8×4的像素单元组压成一个64位的数据块,压缩效果比较差;PVRTC 4-bpp把一个4×4的像素单元组压成一个64位的数据块。游戏中使用4位压缩更多。 | 尺寸为2的N次幂,并且宽高相同。 |
ETC1 RGB 4Bit | 0.125 | 支持Opnegl ES2.0的GPU | OpenGL ES2.0版本支持,移动GPU均支持的一个格式,遗憾的是不支持Alpha通道。ETC1把一个4x4的像素单元组压成一个64位的数据块。游戏开发中采用最多的格式,不过麻烦的是需要对Alpha通道进行单独存储,Unity5.4.3版本之后提供了官方支持 | 尺寸为2的N次幂,长宽可不同 |
ETC2 ARGB/RGB 4bit | RGBA:0.25/RGB:0.125 | 支持Opnegl ES3.0的GPU | OpenGL ES 3.0以上才支持,补全了ETC1不支持Alpha通道,支持更高质量的压缩。虽然如此,从Android官方数据来看,还有相当大的设备是采用Opengl ES2.0;使用需要谨慎,不过随着设备更新换代,开发时间周期比较长的游戏可以考虑直接使用 | 尺寸为4的倍数 |
Unity官网对每个平台默认的纹理压缩格式以及使用建议给出了详细描述,需要注意的是:在不同移动GPU平台下选择GPU支持的压缩纹理,就可以在不需要CPU解压的情况下直接被GPU采样,节省CPU内存和带宽,也可以节省存储的体积。如果目标平台不支持设置的压缩格式,纹理将解压为RGBA32或者RGB24,浪费CPU时间和内存。
ASTC
从IOS9(A8架构)Apple 手机开始支持ASTC压缩格式 ,如果考虑放弃Apple 6代之前的手机兼容问题了,可以直接使用了。相对于PVRTC2/4而言,ASTC(4X4)的压缩比会增加到0.25,不过显示效果也会好很多,而且不需要把图片设置为方形。
Using ASTC Texture Compression for Game Assets 说明的比较详细,也给出了一些使用上的建议,即针对不同贴图类型给出不同的压缩方案。
ARM的参考资料: ASTC: The Future of Texture Compression
引用
[1]: "常用纹理和纹理压缩格式" http://blog.csdn.net/ynnmnm/article/details/44983545
[2]:"Unity Compressed" https://docs.unity3d.com/Manual/class-TextureImporterOverride.html
[3]: "移动设备的纹理压缩方案" http://gad.qq.com/article/detail/72
[4]: "关于U3D贴图格式压缩" http://blog.sina.com.cn/s/blog_5b6cb9500102vi6i.html
[5]: "各种移动GPU压缩纹理的使用方法" http://www.cnblogs.com/luming1979/archive/2013/02/04/2891421.html
[6] "版本分布情况" https://developer.android.com/about/dashboards/index.html#Screens