先讲解一下mono特性
一个很重要的信息:mono内存从系统里面申请的内存不会返回给系统
mono内存不足的时候会预申请内存(内存大小不定有可能10m有可能5m)
最近优化一个mono内存泄露问题
引起mono一直撑大多数都是内存泄露,要不就是一下子申请很大块内存
我这里主要说内存泄露,这个更难查
现在正常项目很多脚本不继承MonoBehaviour,实例化出来的对象,要及时处理生命周期,避免内存泄露,内存泄露导致mono一直撑大,然后内存一直涨而且不会返还给系统,导致游戏闪退
比如我项目中角色上各种控制器:数据控制器,buff控制器,武器控制器,技能控制器这些都是不继承MonoBehaviour,这些对象系统判断没引用就会回收,不过游戏战斗复杂各种引用导致对象没有释放(因为MonoBehaviour有生命周期就算被引用也会释放)。
我写个简单的例子如何内存泄露
using System.Collections.Generic;
using UnityEngine;
public class test : MonoBehaviour {
test1 t;
test1 t1;
void Start ()
{
t = new test1();
t1 = new test1();
for (int i = 0; i < 10000; i++)
{
t.list.Add(new test2());
}
t1.list = t.list;
t = null;
//释放t,然后t1引用t.list导致t.list无法回收
//处理方法 t.list.Clear();t1 = null;
}
}
public class test1
{
public List<test2> list = new List<test2>();
}
public class test2
{
int[] a;
public test2()
{
a = new int[1000];
}
}
看看数据,一直没有回收t.list
如果想回收t.list,加t1 = null;或者t.list.Clear();
下面是加了t.list.Clear();的结果
总结一下
不继承MonoBehaviour的对象是根据没有引用才释放,如果引用复杂可能导致不回收,从而导致内存泄露
1.对象不用的时候手动设置为null标记去回收就可以解决
2.对象里面的列表数组字典,清对象之前全部清掉
如果嵌套比较多的更加要注意