unity内存管理与优化

在圣典看到一张图片很详细,原文链接:http : //www.ceeger.com/forum/read.php?tid= 4394



1.创建时

无论是从万维网。还是文件或者存储器,用assetbundle.load加载需要的资产,加载完成之后用assetbundle.unload(假)释放assetbundle文件本身镜像,但不销毁加载的资产对象。


2.释放时

实例用破坏释放。

在合适的地方使用resource.UnloadUnUsedAssets释放没有已近没有引用的资产。

如果需要立即释放,需要GC.Collect的()立即强制释放。

破坏:主要销毁克隆对象,但不会释放该对象的所有引用

AssetBundle.Unload(假):释放assetbundle文件的内存镜像

AssetBundle.Unload(真):释放AB文件内存镜像同时,释放所有已经负载的资产对象

resources.unloadasset(对象):显示释放次磁盘文件加载的资产

resource.unloadunusedasset:释放所有没有引用的对象

所以GC.Collect()


3.对于unusedasset不仅指没有实际物体引用,还有变量的引用

object obj = resources.load(“prefab”);

gameObject go =启动(obj)作为gameobject; //强制转换

销毁(去);

OBJ = NULL;

resource.unloadunusedasset();

如果没有OBJ = NULL,调用resource.unloadunusedasset()不可能释放掉,因为​​预制还被OBJ引用,所以unusedasset不仅指没有实际物体引用,也指变量的引用


4.优化

  • 优化程序代码内存占用:打包时剥离自己不需要的内库,大部分.net api都用不到
  • 托管堆优化:减少对实例化和破坏的调用,例如使用对象池,尽可能早的将不需要使用的资产去掉
  • 本机堆优化:

1.减少在数字体系菜单中对资源的直接引用,而是使用resource.load()在需要时读取,在使用之后通过resource.unloadasset()和resource.unloadunusedasset()将其卸载

                  2.singleton不会在场景切换时摧毁,因此需要减少代码耦合,或者手动销毁,设置为空


你可能感兴趣的:(ünity)