Unity性能优化 - 内存篇

本篇文章主要内容参考UWA的《性能优化,进无止境-内存篇》。地址如下:

性能优化,进无止境-内存篇(上)

性能优化,进无止境---内存篇(下)

本篇主旨是总结两篇内容的重点,细节还请在作者文章查看。

内存优化主要关注点:

1.资源内存占用;2.引擎模块自身内存占用;3.托管堆内存占用。4.内存泄露。5.无效的Mono堆内存开销。6.资源冗余。

一、资源内存占用:

资源的内存占用往往占据了总体内存的70%以上。

因此,资源使用是否恰当直接决定了项目的内存占用情况。
资源主要可分为如下几种:

纹理(Texture)、网格(Mesh)、动画片段(AnimationClip)、音频片段(AudioClip)、材质(Material)、着色器(Shader)、字体资源(Font)以及文本资源(Text Asset)等等。

其中,纹理、网格、动画片段和音频片段则是最容易造成较大内存开销的资源。

纹理压缩格式可参考文章:Unity - 纹理压缩

一、纹理:

纹理资源可以说是几乎所有游戏项目中占据最大内存开销的资源。
一个6万面片的场景,网格资源最大才不过10MB,但一个2048x2048的纹理,可能直接就达到16MB。
因此,项目中纹理资源的使用是否得当会极大地影响项目的内存占用。

(1)纹理格式:
不仅影响着纹理的内存占用,同时还决定了纹理的加载效率。
根据硬件的种类选择硬件支持的纹理格式。
Android平台的ETC、iOS平台的PVRTC、Windows PC上的DXT等等。
色阶问题:
由于ETC、PVRTC等格式均为有损压缩,因此,当纹理色差范围跨度较大时,均不可避免地造成不同程度的“阶梯”状的色阶问题。
可以使用RGBA32/ARGB32格式来实现更好的效果。该压缩会造成很大的内存占用。一定要慎重使用RGBA32或ARGB32格式的纹理压缩。
更为明智的选择是尽量减少纹理的色差范围,使其尽可能使用硬件支持的压缩格式进行储存。
ETC1 不支持透明通道问题:
建议研发团队将透明贴图尽可能分拆成两张,RGB24位纹理和Alpha8纹理。通过特定的Shader来进行渲染,从而来达到支持透明贴图的效果。
该方案可以有效降低纹理的内存占用。
目前已经有越来越多的设备支持了OpenGL ES 3.0,这样Android平台上你可以进一步使用ETC2甚至ASTC,这些纹理格式均为支持透明通道且压缩比更为理想的纹理格式。
(2)纹理尺寸
一般来说,纹理尺寸越大,则内存占用越大。
如果512x512的纹理对于显示效果已经够用,那么就不要使用1024x1024的纹理,因为后者的内存占用是前者的四倍。
(3)Mipmap功能。
Mipmap旨在有效降低渲染带宽的压力,提升游戏的渲染效率。
但是,开启Mipmap会将纹理内存提升1.33倍。
绝大多数UI均是渲染在屏幕最上层,开启Mipmap并不会提升渲染效率,反倒会增加无谓的内存占用。
(4)Read/Write
建议研发团队密切关注纹理资源中该选项的使用,因为开启该选项将会使纹理内存增大一倍(会增加一份拷贝在内存里)。

 二、网格

Normal、Color和Tangent,这些数据的存在将大幅度增加Mesh资源的文件体积和内存占用。

 二、引擎模块自身占用:

占据较大内存开销的是这两处:WebStream 和 SerializedFile。其绝大部分的内存分配则是由AssetBundle加载资源所致。

三、托管堆内存占用:

目前Unity所使用的Mono版本存在一个很严重的问题:

Mono的堆内存一旦分配,就不会返还给系统。这意味着Mono的堆内存是只升不降的。

四、内存泄露:

通过工具和经验进行判断内存是否发生泄漏。

  • 误区一
    我的项目进出场景前后内存回落不一致,比如进入场景后,内存增加40MB,出来后下降30MB,仍有10MB内存没有返回给系统,即说明内存存在泄露情况。
  • 误区二
    我的项目在进出场景前后,Unity Profiler中内存回落正常,但Android的PSS数值并没有完全回落(出场景后的PSS值高于进场景前的PSS值),即说明内存存在泄露情况。

在此有必要说明一下,以上两种情况均不能表明内存存在泄漏问题。

造成内存不能完全回落的情况有很多。

比如资源加载后常驻内存以备后续使用、Mono堆内存的只升不降等等,这些均可造成内存无法完全回落。 

五、无效的Mono堆内存开销:

避免一次性堆内存的过大分配。
避免不必要的堆内存开销。

六、资源冗余:

一、AssetBundle打包机制出现问题
同一份资源被打入到多份AssetBundle文件中。
二、资源的实例化所致
大量实例化对象导致冗余资源过多,过多的冗余资源却为Resources.UnloadUnusedAssets API的调用效率增加了相当大的压力。

  • 0
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值