Unity 贴图压缩方法及对比
发表于2018-11-21
目前的手机内存是越来越大了,但对于一些低端设备来说,就必须要考虑到贴图压缩的问题,不然这些低端设备会卡的要死,本篇就针对于此,给大家介绍下内存优化中非常重要的一个部分贴图压缩方法,并对于不同平台下选择的贴图压缩方法做何种调整。
以下是常用的一些贴图压缩对比图
我们在压缩的时候,通常会把贴图分为透明和不透明类型,对于不透明的贴图,则没有通道图,可以直接用RBG16、RGB PVRTC4、ETC来压缩。
对透明的贴图,我们需要分离出两张图,一个是颜色图(包含RGB通道)一个是通道图(定义alpha)
这样分离的原因在于,可以达到更好的压缩质量,而又不至于占用内存太大。
比如,颜色图用RGB PVRTC4,通道图也用RGB PVRTC4,这样一张256KB的图可以压缩到64KB。
上图列出的是在IOS的平台下的压缩方法,IOS平台的GPU型号统一,所以以上的贴图压缩格式,适合任何IOS平台。对于Android平台下也差不多,只是PVRTC 4换成了ETC,例如:通道图和颜色图都是RGB ETC 压缩。只是不确定所有Android平台都支持RBG16,这个还没做过测试,理论上是都支持的。
对于一些精度要求低的贴图,例如场景中的花花草草,甚至可以用RGBA PVRTC2来压缩。比RGBA PVRTC 4还要少一半。
对于UI贴图,优先推荐使用RGB16 + 通道图的压缩方式,因为这对精度上是无损的(就是不会模糊),但会产生色偏。就是一些颜色值发现了变化(PVRTC/ETC这些压缩算法也不能百分百还原颜色值,但不会像RGB16一样发生大片的颜色的丢失)。发送变化的原因在于,RGB16其实就是RGB565,在每个通道的最低3位的信息都被丢弃。
所以颜色上会有大面积的偏差,特别是对于渐变类型的纹理,RGB16适合没有渐变或颜色明快的纹理。这个问题可以在前期定美术风格的时候,就考虑进去。
但大多数情况下,这些损失是可以接受的,如果不能接受,用PVRTC4来压缩或者原图。
总结
IOS平台:对于UI,优先使用RGB16+RGB PVRTC4,次选RGB PVRTC4+RGB PVRTC4。
对于场景,根据精度要求使用RGB PVRTC4+RGB PVRTC4或RGBA PVRTC4,如果精度要求更低,可考虑PVRTC2
Android平台:如果想全平台通用,压缩方式没什么可选择的,对于UI和场景,最通用的方式是RGB ETC4+RGB ETC4
压缩质量:仅比较RGB这三个通道的质量,RGBA32 > RBG16 > RGBA16 > RGB PVRTC4/ETC4 > RGB PVRTC2