【转载】Unity 贴图压缩方法及对比

305 阅读3分钟

文章来源: 腾讯独立游戏孵化器
原文链接: Unity 贴图压缩方法及对比 | feng

原文写得很好,但是主题格式我不太喜欢,所以我对文章的格式进行了修整,方便自己日后阅读

正文

目前的手机内存是越来越大了,但对于一些低端设备来说,就必须要考虑到贴图压缩的问题,不然这些低端设备会卡的要死,本篇就针对于此,给大家介绍下内存优化中非常重要的一个 部分贴图压缩方法,并对于不同平台下选择的贴图压缩方法做何种调整。

  • 以下是常用的一些贴图压缩对比图

我们在压缩的时候,通常会把贴图分为 透明不透明 类型,对于不透明的贴图,则没有通道图,可以直接用 RBG16RGB PVRTC4ETC 来压缩。

对透明的贴图,我们需要分离出两张图,

  • 一个是颜色图(包含 RGB 通道)
  • 一个是通道图(定义 Alpha)

这样 分离的原因 在于,可以达到更好的压缩质量,而又不至于占用内存太大。

比如,颜色图用 RGB PVRTC4,通道图也用 RGB PVRTC4,这样一张 256KB 的图可以压缩到 64KB

上图列出的是在 IOS 的平台下的压缩方法,IOS 平台的 GPU 型号统一,所以以上的贴图压缩格式,适合任何 IOS 平台。对于 Android 平台下也差不多,只是 PVRTC4 换成了 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 PVRTC4RGBA PVRTC4,如果精度要求更低,可考虑 PVRTC2

Android平台

如果想全平台通用,压缩方式没什么可选择的,对于 UI 和场景,最通用的方式是 RGB ETC4+RGB ETC4

压缩质量

仅比较 RGB 这三个通道的质量,RGBA32 > RBG16 > RGBA16 > RGB PVRTC4/ETC4 > RGB PVRTC2