【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乘以每像素占用内存,就是当前图片的大小。

posted @ 2024-03-11 10:25  皮卡味月亮  阅读(115)  评论(0编辑  收藏  举报