这算是Unity优化的一个基础环节吧,没有机会真正去接触,还是要了解下。
图片格式
- 不同格式的本质区别在于压缩算法不一样,结果图片大小,还原度也各不相同。
- 常用图片格式有Png,Jpg,Tga,Psd等。平时主要用Png,Jpg。
- Jpg是有损压缩不透明,Png是无损压缩有透明。
简单纹理格式
- Png等图片压缩格式无法直接被GPU解码,需要先解压,便会造成消耗。
- 不论导入的图片是什么格式,Unity都会将其转换成纹理格式,便于GPU读取。(应该算解压成原始格式吧)
- 有RGB16,RGB24,RGBA16,RGB32等。
纹理压缩格式(硬件压缩格式 Hardware Accellerated Formats)
- 把纹理进一步压缩(Texture Compression),不同于Png的那种压缩,是针对GPU的压缩格式。
- 不同的GPU能解析的压缩格式也不同,所以可能没法简单的只用一种压缩格式。并且如果发现GPU不支持当前压缩格式,Unity就会将纹理转换成RGB(A),首先是解压过程的消耗,其次是内存中会保存两个纹理。
- IOS所有设备支持PVRTC,Android所有设备支持ETC1,但是ETC1没有透明通道。
- 有的压缩格式要求文件的分辨率数值为2的次幂(ETC),有的还要求纹理是个正方形(PVRTC)。
-
PVRTC4分别有RGB模式,也有RGBA模式,所以是可以有透明通道的(下面的表格有处错误)。
纹理压缩格式的选择
高清无压缩 - RGBA32
- 等同于原图了,效果最好,效率最差。
中清晰中压缩 - RGBA16+Dithering/RGB16
- RGBA16在遇到渐变的时候表现很差,所以需要做抖动(Dithering)处理。
- RGB16不带透明通道。
低清晰高压缩 - ETC1+Alpha/PVRTC4
- 能直接被GPU使用,占用少,效率高。
- ETC1没有透明通道,需要搭配一张透明贴图。
- ETC和PVRTC都要求像素长宽都为2的次幂,PVRTC要求像素长宽一致。
总结
- 一般方案:ETC1+Alpha/PVRTC4 和 RGB16/RGBA16 搭配使用。
- 图片分辨率数值最好为2的次幂(据说就算不是2次幂,最终到GPU中也需要拉伸为2次幂),最好是正方形(用于匹配压缩格式)。