【Unity】内存优化之— —Texture的MaxTextureSize以及Format压缩格式
本人才疏学浅,只是近期略看了一下Texture的内存,如有不对的地方,还望大佬指正。
参考文章:
1.说一说图片占用的内存
关于图片的内存,是怎么算的呢,就是图片的长乘以宽,乘以每个像素点占的byte大小。
MaxTextureSize,影响的就是基础的长和宽。
图片的压缩格式,影响的就是每个像素点占的byte大小。
就举一个最基础的例子,1024X1024大小,格式是RGBA32的图片。
那其内存就为1024x1024x32/8=4x(1024x1024)=4MB。
我们知道1024x1024就是1M(bit),除以8换算为M(Byte),乘以32则是RGBA32中的那个单个像素占的大小,就是32,合起来就是4MB的大小。
2.聊聊MaxTextureSize
而MaxTextureSize,影响的就是图片分辨率。也就是图片在内存中的长宽。
不过也有个前提:当MaxTextureSize大于图片的实际大小时,仍会使用原图片的大小。
当然,也有个需要注意的地方:图片的大小不能超过SystemInfo.maxTextureSize的大小。
3.说一下压缩格式
关于压缩格式。介绍起来就很多了,如果你打开unity当中的图片,然后打开format可能就会惊恐的发现这个图
哇,有这么多格式,只看上一眼便要叫人生出敬畏之心。
莫慌,慢慢来。
这些格式,仔细看一眼,就可以发现,大概分为几类:ASTC、ETC、DXT、PVRTC、以及不采用压缩格式的RGBA。
关于这些格式的原理有兴趣的可以看这个大佬写的文章。链接:https://zhuanlan.zhihu.com/p/237940807
我这里只做一个简单粗暴的我自己使用的压缩格式:
如果目标是电脑PC
性能最优的情况下,使用RGBA32
兼容低性能的情况下,可以选择ARGB16
如果你还想更极限一点,把图片的宽高设置为4的倍数,然后使用DTX1(不支持Alpha)/DTX5
如果目标是安卓手机
ASTC使用: 4X4 5X5 6X6 8X8(ASTC任意图片的宽高)
ETC2使用:Crunched 100/80(ETC2需要图片的宽高为四的倍数)
都不支持的情况下使用ETC (ETC需要图片的宽高为2的幂数,并且不支持alpha通道)
如果目标是iOS手机
ASTC使用: 4X4 5X5 6X6 8X8
不支持ASTC的情况下使用PVRTC(PVRTC需要图片的宽高为2的幂数)
然后Override ETC2 fallback:高质量统一选择32bit,低质量统一选择16bit
Normal map类型的默认按照高质量来,如果你想极限的话,按照低质量也不是什么问题
注:
Crunched的实际运行时内存占用与普通的内存占用一样,只是更加节省存储。
Crunched的图片就是压缩之后再次被crunched压缩一下,所以Crunched之后的图片,在使用时会再次解压缩为相对应的图。
ASTC 4X4 5X5 对应的是高质量的RGBA和RGB图片
ASTC 6X6 8X8 对应的是低质量的RGBA和RGB图片
如果图片很糊也不影响并且内存急需的情况下,可以使用ASTC的10X10、12X12(图片本身在游戏中占的像素越小越好)
如果是3D使用的纹理有远近变化的,建议统一开启MipMap,虽然会增加大约1/3的内存,但是效果确实好。
顺便举一个1024X1024图片的例子:
图片格式 | 图片大小 |
---|---|
RGBA32 | 4M |
RGBA16 | 2M |
ASTC4X4 | 1M |
ASTC5X5 | 0.6M |
ASTC6X6 | 456.9KB |
ETC2(8bit) | 1M |
ETC(4bit) | 0.5M |
PVRTC(4bit) | 0.5M |
至于怎么算的:就是1024X1024=1Mb,然后除以8乘以每像素占用内存,就是当前图片的大小。
热门相关:花开春暖 秾李夭桃 佣兵之王都市行 1号婚令:早安,大总裁! 北宋闲王