学习笔记——Unity3D内存优化(贴图优化)

要学会如何优化Unity3D的贴图,首先要了解Unity3D图片上的各项设置大概是干嘛的,修改之后会导致什么样的变化。另外,贴图资源在Unity3D中占用的内存大小不等于文件本身的大小,而是与贴图资源的设置有关,不论你放入的是PNG,PSD还是TGA,它们都会被自动转换成Unity自己的Texture2D格式。我在游戏开发中常用的图片格式就是jpg和png,jpg 格式是有损压缩 文件小 不支持透明,png:是无损压缩,文件小,支持透明。

可以看到,这张图片在Unity3D编辑器下大小为2.6M                                                   

学习笔记——Unity3D内存优化(贴图优化)_第1张图片

而实际文件大小为342KB

学习笔记——Unity3D内存优化(贴图优化)_第2张图片

同样的设置则只与贴图宽高尺寸有关,与资源原始文件格式无关。因为资源加载后占用内存的大小与安装包打包前资源大小是一致的,所以减小安装包的大小也就是减少贴图资源占用内存的大小。

1.通常为了优化DrawCall,我们会把同一个UI界面上的图片放进一个图集里。Unity3D的图集长宽只会是2的幂次方,比如256*128,512*512等,而且图集占用内存的大小只和它的压缩格式与长宽有关,与图集里图片的数量多少无关;Unity3D会根据图集内的图片大小自动调整图集大小,如果有新的图片放入图集中,Unity3D会调整图集中所有图片的位置,给新的图片腾出一块地方放进去,当无论如何调整都放不下这张新图片时,Unity3D就会给图片们换个合适的大房子,此时图集占用的内存就会翻倍了。所以我们应该尽可能的让一张图集放入最多的图片,不浪费图集上的每一块地方。图集大小要控制在1024*1024以内,因为超过1024*1024的图集占用的内存会非常大,而且通常会导致一些不必要的内存占用。因此过大的背景图可以让美术切成多个块打包到图集中,然后自己在Unity3D中拼接起来,例如下面这张图集:

学习笔记——Unity3D内存优化(贴图优化)_第3张图片

很明显,这张图集有将近三分之一是空的,也就是说,有三分之一内存浪费掉了,拆成两张图集后。总内存占用九减少了0.5M

学习笔记——Unity3D内存优化(贴图优化)_第4张图片学习笔记——Unity3D内存优化(贴图优化)_第5张图片

2.针对不同的平台,不同的贴图资源,结合实际需求,可以选择不同的压缩格式,能大大减少内存的占用。在项目中,尽可能是使用ETC1和PVRTV4等GPU直接支持的图片格式,不仅内存占用低、性能也更好;当出现质量不及格时,再逐步的提升压缩格式,来满足需要。使用ECT1和PVRTC4 格式压缩,一张1120*600的贴图,会被处理成1024*512,而且转换过程较慢,浪费性能,也会导致图片失真,所以我们应该提前将贴图资源转化为符合标准的图片。

学习笔记——Unity3D内存优化(贴图优化)_第6张图片

该表转自:https://zhuanlan.zhihu.com/p/25205686

如果原图不是2的幂次方,可以在advance设置Non Power of 2值,

ToNearest :转换成距离该图片最近的2的幂次方值。
ToLarger : 转换成比该图片大的2的幂次方值。
ToSmaller : 转换成比该图片小的2的幂次方值。

3.Mipmap在UI贴图上一定要取消勾选。它有点类似于LOD技术,但是不同的是,LOD针对的是模型资源,而Mipmap针对的是纹理贴图,勾选Mipmap后,Unity3D会生成八个精度不同的贴图,根据贴图与摄像机距离选择使用不同精度的贴图,距离摄像机越远,显示的贴图像素越低,反之,像素越高。所以勾选Mipmap必然占内存,大概会将内存提升30%,因为大多数UI图片都是渲染在屏幕的最上层,就没必要勾选。对于具有较大纵深感的3D游戏,3D场景模型和角色一般是建议勾选Mipmap,能有效有效降低渲染带宽的压力,提升游戏的渲染效率。

4.推荐压缩纹理格式

目前(日本)市面上ES3.0的占比超过9成,Apple A8占比超过9成,推荐android使用ETC2, ios使用ASTC,或者PVRTC。(打入Bundle中的图片资源是已经预先转换好的纹理格式,这样加载的时候优化了解码和转换的过程,能够提高加载速度。这也是为什么不同平台的bundle不能跨平台使用的原因之一)。

你可能感兴趣的:(学习笔记——Unity3D内存优化(贴图优化))