内存泄漏是优化方面的名词,主要是由于不再使用的资源没有及时清理,来释放内存,造成内存的浪费,造成系统卡顿。 或者说,内存就像花呗,额度就这么多,有借要有还,而且手里有闲钱的时候就记得还,以保证内存的充足,如果占着不用,就会在其他需要使用的时候内存不足,就容易崩溃出现问题。 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.强化声明周期的概念,无论是代码对象还是资源,都有它存在的生命周期,生命周期结束后就要被释放。
标签:泄漏,Cube,Mono,Unity,内存,泄露,资源 From: https://www.cnblogs.com/weigangblog/p/18204194