Mono内存和GC

Unity的脚本申请的内存称为Mono内存(IL2CPP环境下就是IL2CPP内存),注意不要把它和资产(模型、音频等)所占用的内存搞混了。

我们常说的GC和Mono内存有关,Mono内存刚开始给20M,如果随着软件的进行超过了这个值,就会触发GC,触发后如果内存还不够,就会尝试增加内存,变为40M。Mono内存只会增不会减,所以我们在脚本中要控制好类的释放,不能总是在new

Unity的关闭GC

Unity有手动控制GC的功能,详见:

Unity - Scripting API: GarbageCollector

Resources.UnloadAsset

ResourceManager.UnloadUnusedAssets方法中,我们使用了Resources.UnloadUnusedAssets()来清理编辑器下的资源。

1
2
3
4
5
6
7
8
9
10
11
12
    /// <summary>
/// 回收一个资源
/// </summary>
/// <param name="destroyCache">是否清除缓存</param>
protected void DestroyResourceItem(ResourceItem item, bool destroyCache = false)
{
//...
#if UNITY_EDITOR
Resources.UnloadUnusedAssets();
#endif
}

我们如果使用Resources.UnloadAsset并且先卸载再置空

1
2
3
4
5
6
7
8
9
10
11
12
13

protected void DestroyResourceItem(ResourceItem item, bool destroyCache = false)
{
//...
if(item.m_Obj != null)
{
#if UNITY_EDITOR
Resources.UnloadAsset(item.m_Obj);
#endif
item.m_Obj = null;
}

}

这个方法只会把资源的引用(item.m_Obj的引用)置空,但是具体的资源仍然在编辑器中保留。

在编辑器下尽量把代码中引用资源的部分及时置空,因为不管是Resources.UnloadAssetResources.UnloadUnusedAssets();资源还有引用的话会马上再次读取。

编辑器加载的好处

  1. 不需要每次运行都去打AB包
  2. 不同平台AB包(编辑器下,只有加载Windows平台AB包,显示才正常)