Unity性能优化:什么是内存泄露?

内存泄漏是优化方面的名词,主要是由于不再使用的资源没有及时清理,来释放内存,造成内存的浪费,造成系统卡顿
 
或者说,内存就像花呗,额度就这么多,有借要有还,而且手里有闲钱的时候就记得还,以保证内存的充足,如果占着不用,就会在其他需要使用的时候内存不足,就容易崩溃出现问题。
 
Unity中的内存泄漏,分为代码泄漏和资源的泄漏。
1.代码中的泄漏,Mono内存泄漏
Unity是基于Mono的C#,作为脚本语言,是基于Garbage Collection机制的内存托管语言,GC并不是万能的,GC能做的是通过一定算法找到垃圾,自动将垃圾占用的内存回收。
 
引用计数是计算机中的一种内存管理技术,是指将资源的被引用次数保存起来,当被引用次数变为零时就将其释放。使用引用计数可以实现自动资源管理的目的,同时引用计数还可以使使用引用计数回收未使用资源的GC算法。
 
Unity中的Mono内存的占用,只会增加不会减少,释放的时候,归还给Mono建立的内存池,不会归还给操作系统。
Mono内存泄漏是Unity游戏开发中需要特别重视的部分
 
2.资源中的泄漏,Native内存泄漏
资源泄漏,顾名思义,是指将资源加载之后占有了内存,但是在资源不用之后,没有将资源卸载导致内存的无谓占用。
 
代码分配的内存,是通过Mono虚拟机,分配在Mono堆内存上的,内存占用量一般比较小,主要是在处理程序逻辑时候使用。
unity的资源,是通过Unity的C++层,分配在Native堆内存上的。
 
unity的内存回收是需要主动触发的,主动调用的接口是Resources.UnloadUnusedAssets()
 
内存快照比较是寻找内存泄漏的常用手段,将两次内存的状态截取出来,进行比较,可以清楚地发现内存的变化,寻找内存的增量与泄漏点。一般新增的内存分配,可以视为泄漏。
 
Mono内存的放大镜——Cube
Cube是 腾讯游戏下的腾讯WeTest平台上针对Unity项目的性能指标收集工具,通过Cube可以较方便地获取到游戏的各项性能指标,为性能优化提供了方向。同时Cube也是游戏性能一个很好的衡量工具。
 
注:平时开发过程防微杜渐,内存泄漏是完全可以避免的
1.架构上,多添加析构的abstract接口,注意清理自己产生的垃圾
2.严格控制static的使用,非必要的地方禁止使用static
3.强化声明周期的概念,无论是代码对象还是资源,都有它存在的生命周期,生命周期结束后就要被释放。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
posted @ 2024-05-21 15:38  weigang  阅读(32)  评论(0编辑  收藏  举报