如前文所说,和原始的PNG图片相比,压缩纹理在内存和包体上都有巨大的优势,但由于移动设备的硬件和OpenGL ES支持不同,目前还没有一种压缩纹理格式既能发挥优势,又能兼容所有设备,所以需要针对不同平台做定制。
1 不同纹理的特点
1.1 ETC1
ETC1
内存占用是PNG的1/4,文件大小是PNG的1-3倍(经过zip或打成apk后是PNG的1/2~1/3)。但是ETC1只能存储RGB信息,不适用带透明度的图片,为解决这个问题,Creator在ETC1文件中额外写入了透明度信息,即ETC1+A格式,所以占用内存也比原始ETC1多一倍,即相当于PNG的1/2。ETC1/ETC1+A需要OpenGL ES 2.0(对应WebGL 1.0)环境,目前几乎所有Android手机都支持ETC1,但是iOS不支持。
1.2 ETC2
ETC2
在内存和文件大小方面和ETC1一样,即内存占用是PNG的1/4,文件大小是PNG的1-3倍(经过zip或打成apk后是PNG的1/2~1/3)。和ETC1不同的是,ETC2能完整存储RGBA信息,适用于任何图片,且Android和iOS系统都支持。但是ETC2需要OpenGL ES 3.0(对应WebGL 2.0)环境,目前还有不少低端Android手机不兼容,iOS方面从iPhone5S开始都支持OpenGL ES 2.0。
1.3 PVR
PVR
常用的是PVRTC4+A,在内存和文件大小方面和ETC一样,适用于所有iOS设备,但是Android不支持。另外PVR要求纹理长宽相等(正方形)且是2的幂次方,例如1280720的PNG图片,转换为PVR后变成20482048,这一点会大大增加内存消耗。在实测中还发现转换后的图片质量不如ETC,存在模糊、毛边现象,对画面要求高的游戏不适合。如果要用PVR格式,则图片大小应该依次限制在256、512、1024、2048内,宁愿用3张1024也比用一张2048好。
2 Creator使用总结
- Creator转换压缩纹理的选项,根据转换速度分为Fast、Slow等好几档,速度越慢则画面质量越好。不管选哪个,只影响显示效果和转换时长,显存占用都是一样的。
- 计算压缩纹理的显存占用,有个简单的统计方案,即纹理文件大小就是显存占用,例如文件大小是1.5M,则它占用的显存也是1.5M。
- 从OpenGL ES 2.0开始,GPU纹理支持非2幂次方,也就是说,小于2048的图片比2048图片更节省内存。目前所有手机都已经是OpenGL ES 2.0及以上了。
- 对于Android原生平台,要想尽量兼容大多数设备,又想发挥内存和包体优势,目前最佳的是ETC1。
- 对于iOS原生平台,PVR画面质量不佳,如果只考虑iPhone5S及之后的设备,则使用ETC2比PVR好。
- 从OpenGL ES 3.0开始,ARM新推出一种ASTC格式,Android和iOS都支持,画面质量比PVR好,且不要求纹理长宽相等和2的幂次方。ASTC可能会是未来的统一格式,但目前很多Android低端设备还不支持。