unity纹理格式选择

Android平台

不带透明通道优先使用ETC1,而带透明通道的优先使用ETC2.
如果显示质量无法达到要求还可以使用RGBA16,最后才使用RGBA32.
总体来说正确使用优先顺序是ETC1>ETC2->RGBA16->RGBA32.
另外针对Android平台Unity还实现了一套Crunched压缩方式,比如RGBA Crunched ETC2压缩格式,会先用ETC2进行压缩,然后再用Crunched压缩一遍。虽然运行时逻辑上需要再额外解压缩一遍,但是由于Crunched压缩会让贴图大小更小,加载的时间会比单纯加载ETC2快很多。总体来说RGBA Crunched ETC2会比ETC2加载更快,而且包体会更小.

纹理优化:通道分离

针对Android平台Unity还提供了一种通道分离的方式: 将图片压缩成ETC1,提取Alpha生成一张通道图. 为了让混合起来的Alpha效果更好,Unity将通道图保存的格式设定为a8格式。 比如一张1024X1024的贴图,ETC1压缩结果为0.5M,通道图提取后a8格式压缩结果为1M,加起来就是1.5M。对比直接使用ETC2压缩1024贴图为2M,前者节省了0.5M内存。 注意 虽然使用通道图内存上可以减少一些,但是在Shader中需要进行2次采样,综合看在某些机器上未必性能会得到提升。

iOS平台

如果没有透明通道那么使用PVRTC来压缩必然是首选 优先使用PVRTC,其次使用ASTC. 不带透明通道可以使用ASTC 5X5(表示每个压缩块的大小是5 X 5=25),带透明通道可以使用 ASTC 4X4(表示每个压缩块的大小是4 X 4=16).
如果显示质量无法达到要求还可以使用RGBA16,最后才使用RGBA32,总体来说正确的使用优先级顺序是PVRTC>ASTC->RGBA16->RGBA32

总结

以一张1024X1024的贴图为例:

RGBA32 Bit:表示每个像素占用32位4字节,内存大小 1024 X 1024 X 4 = 4M
RGBA16 Bit:表示每个像素占用16位2字节,内存大小 1024 X 1024 X 2= 2M
RGB ETC1 4Bit: 表示每个像素占用4位0.5字节,内存大小 1024 X 1024 X 0.5= 0.5M
RGBA ETC2 8Bit: 表示每个像素占用8位1字节,内存大小 1024 X 1024 X 1= 1M
RGBA PVRTC 4Bit: 表示每个像素占用4位0.5字节,内存大小 1024 X 1024 X 0.5= 0.5M
RGBA ASTC 4X4 : 表示每个像素占用8位1字节,内存大小 1024 X 1024 X 1= 1M
很显然占用内存越小的贴图,加载速度肯定就越快,那么打开这样的界面无疑也就越快了。

纹理尺寸注意事项

并不是所有图片都需要打图集的,因为一旦图片打进图集,哪怕仅仅只需要显示这个图集上的一小部分,也会把整个图集拉进内存中。 所以我们会将宽高超过128或者256的图从图集中拿出来,比如游戏中的一些玩家头像,背景图等等。

IOS上如果没有透明通道那么使用PVRTC来压缩必然是首选. 如果一些玩家的头像设计上就不是正方形,如果恰巧头像没有半透,那么使用ASTC岂不是浪费了。

由于图集肯定满足2的幂次方,所以我们将这张图变成一个单独的图集就可以进行正确的压缩了 而且图片不会模糊,如果使用Non Power of 2拉伸图片就会模糊。

注意

ETC1、ETC2以及ASTC 4X4 要求图片宽和高可以不相等但是必须被4整除,例如512X1024 4X16
IOS的PVRTC压缩格式要求图片的宽高必须相等并且是2的整数次幂,例如512X512,如果是512X1024那么就无法压缩了。
另外ETC2和ASTC 对硬件也有一些限制,ETC2只支持OpenGL ES 3.0以上的Android手机(大概2013年以后的手机都支持)ASTC只支持苹果A8以后的设备,iPhone 6 及以上的手机(大概2014年以后的手机都支持)

原内容来自于 雨松MOMO的UWA课堂

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值