点击量:38

设备资源的限制和制作过程中对表现的无限追求永远是矛盾点,不会随设备的发展而转移。纹理压缩就是这种矛盾的一种解决方式,不同于 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 把一个 4×4 的像素单元组压成一个 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