【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号婚令:早安,大总裁!   北宋闲王