【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
我这里只做一个简单粗暴的我自己使用的压缩格式:
压缩使用推荐 | |||||||||||
透明 | 不透明 | NormalMap | 备注 | ||||||||
PC最高质量 | RGBA32 | RGBA32 | |||||||||
Android | 支持ASTC | Android 高质量 | ASTC4X4 | ASTC5X5 | ASTC4X4 | 任意图片长宽,需要支持OpenGL ES 3.0,Android 4.3(API 18)及更高的版本支持这个API规范。 目前市面上大部分手机都支持。 |
|||||
Android 中质量 | ASTC6X6 | ASTC8X8 | ASTC6X6 | ||||||||
Android 低质量 | ASTC8X8 | ASTC10X10 | ASTC6X6 | ||||||||
不支持ASTC | Android 高质量 | RGBA Crunched ETC2(100) | RGBA Crunched ETC2(80) | RGBA Crunched ETC2(100) | 需要图片长宽为4的倍数,Crunched能有效减少储存占用,但是内存与普通的一致(支持OpenGL ES2.0手机都支持) | ||||||
Android 低质量 | RGBA Crunched ETC2(80) | RGBA Crunched ETC2(60) | RGBA Crunched ETC2(100) | ||||||||
不支持ETC2 | Android 高质量 | 不支持透明 | RGB Crunched(100) | RGB Crunched(100) | 需要图片长宽为2的幂,不支持透明,现在的手机很少使用了,非必要情况下一般不使用 | ||||||
Android 低质量 | RGB Crunched(80) | RGB Crunched(100) | |||||||||
IOS | 支持ASTC | IOS 高质量 | ASTC4X4 | ASTC5X5 | ASTC4X4 | 与安卓一样 | |||||
IOS 中质量 | ASTC6X6 | ASTC8X8 | ASTC6X6 | ||||||||
IOS 低质量 | ASTC8X8 | ASTC10X10 | ASTC6X6 | ||||||||
不支持ASTC | IOS 高质量 | RGBA PVRTC(4bit) | RGB PVRTC(4bit) | RGB PVRTC(4bit) | 需要图片长宽为2的幂,IOS全部机型都适用 | ||||||
IOS 低质量 | RGBA PVRTC(2bit) | RGB PVRTC(2bit) | RGB PVRTC(4bit) |
注:
Crunched的实际运行时内存占用与普通的内存占用一样,只是更加节省存储。
Crunched的图片就是压缩之后再次被crunched压缩一下,所以Crunched之后的图片,在使用时会再次解压缩为相对应的图。
ASTC 4X4 5X5 对应的是高质量的RGBA和RGB图片
ASTC 6X6 8X8 对应的是低质量的RGBA和RGB图片
如果图片很糊也不影响并且内存急需的情况下,可以使用ASTC的10X10、12X12(图片本身在游戏中占的像素越小越好)
如果是3D使用的纹理有远近变化的,建议统一开启MipMap,虽然会增加大约1/3的内存,但是效果确实好。
再贴一下官方默认的格式,以作参考---下图是2023.2版本Unity使用的压缩格式
顺便举一个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乘以每像素占用内存,就是当前图片的大小。