emmm,之前做过一个ios的ar项目,一开始没有拿到ios真机,就暂时先打包安卓进行测试,安卓上一切正常,可是拿到ios真机后,一跑,完♂蛋!直接闪退,Xcode报内存暴增的错误,当时还不会解决这种问题,慌的一批。后来疯狂问大佬,最后在profile里看到了我那些占用好几个G的纹理贴图,于是就结束了。这里还是总结一下贴图的压缩(我个人对图像处理这块的算法了解也不深,这里只从使用角度讲),为了优化你的游戏,正确选择压缩方式也是十分重要的。
1、DXT:NVDIA
顾名思义DX即是DirectX的缩写,T指Texture,是DirectX支持的纹理压缩方式。 共分DXT1-5级别。压缩方式每个都是将图片划分为4*4的像素块。其中DXT1压缩后 4*4像素块共占用64位,其中有2个16位的RGB颜色和16个2位索引。 DXT1中的两个RGB颜色负责表示所在压缩的4×4像素块中颜色的两个极端值,然后通过线性插值我们可以再计算出两个中间颜色值,而16个2位索引则表明了这4×4个像素块所在像素的颜色值,2位可以表示4种状态,刚好可以完整表示color_0,color_1以及我们通过插值计算出的中间颜色值color_2和color_3,而对于具有一位Alpha的贴图,则只计算一个中间颜色值,color_3用来表示完全透明。对于如何判断DXT1格式是表示不透明还是具有1位alpha的贴图,则是通过两个颜色值color_0和color_1来实现的,如果color_0的数值大于color_1则表示贴图是完全不透明的,反之则表示具有一位透明信息。故当需要压缩没有alpha通道或者只有1位alpha通道的纹理时,使用DXT1显然是最合理的,透明通道全损。
DXT2、DXT3就可以表示具有更复杂透明信息的贴图了,这两种格式采用的是显示的alpha表示。DXT2与DXT3中表示颜色信息部分是不变的,而有附加了64bit也就是每个像素4bit来表示他们的alpha通道信息。所以这是每个4*4像素块就占用128bit空间。DXT2与DXT3之间的区别在于 DXT2中颜色是已经完成了Premultiplied by alpha操作(已完成颜色与alpha的混合,当透明度发生改变时,直接改变整体颜色值,不必再单独复合),DXT3的Alpha信息则是相对独立的,之所以要区分开了则是为了适应不同的需要,因为有些场合需要独立的Alpha信息。
DXT4、DXT5也是用来表示具有复杂透明信息的贴图的,与2、3的区别在于4、5的alpha通道信息是通过线性插值计算得到的,类似与DXT1的颜色信息。4*4的像素块占用64bit,不同在于其中采用了2个8bit的alpha值和16个3bit的索引值,在两个8bit的alpha值间插值然后用3位索引值表示所以实际上每个像素可以拥有八种不同的状态,并且跨度是在两个范围alpha值之间的,准确率相对来说就高了很多并且并没有占用更多的空间。DXT4的颜色值是理解为已经完成Premultiplied by alpha操作的,5则没有。 总结下来就是,没有透明通道的贴图直接上DXT1,有透明通道的贴图在DXT4和DXT5中按需求选择。不选2、3的原因是4、5明显在透明度上精度更高且占内存大小是一样的。
2、ETC纹理压缩
ETC(EricssonTexture Compression)爱立信纹理压缩是2005年初与爱立信合作研 发的一种有损纹理压缩技术,是最通用的纹理压缩格式,几乎所有的安卓设备都可以支持ETC压缩的GPU加速。它是一种为感知质量设计的有损算法,其依据是人眼对亮度改变的反应要高于色度改变。
ETC1压缩提供对24位RGB数据6倍的压缩比率,但是并没有提供对Alpha通道的压缩。
原理上大概是ETC1将4*4的像素块用64bit存储,首先将其分成两个2*4或者4*2的部分,然后每个分出来的块都有一个基础色,每个基本像素块索引存储色差。
ETC2是对ETC1的扩展并且兼容ETC1,压缩原理应该差不多并且提高了压缩质量(具体算法就不知道了),并且支持对Alpha通道的压缩,但是只支持OpenGL ES 3.0 OpenGL 4.3。
大部分安卓移动设备还是使用的是ETC1。
3、PVRTC纹理压缩(PowerVR Texture Compression)
///详细可了解 Simon Fenney题为"Texture Compression using Low-Frequency Signal Modulation"的论文,可在官方sdk里面找到
PVRTC有两种压缩算法,4BPP 2BPP,512x512 RGB的原始象素768KB,PVRTC 4BPP压缩后为128KB,PVRTC 2BPP压缩后为64K。不过PVRTC 2BPP效果看上去明显比较差。
值得注意的是,苹果爸爸的图形芯片(PowerVR MBX)对PVRTC压缩技术提供硬件支持,所以在ios端当然首选PVRTC,可以节省大量的内存空间,号称不失真压缩率最高的压缩格式。当然安卓端也可以使用,但是其与DTX的优略性就值得考虑了。
4、ATC(Adreno)
-高通ATI纹理压缩,仅支持对RGB通道的压缩,不支持A通道的压缩。
5、ASTC
值得注意的是从IOS9 开始支持ASTC压缩格式,与PVRTC相比,它的压缩比略有不如,但是显示效果会好很多,可以说性价比很高。
最后附两张表:
