unity3d深入学习笔记5:内存释放

时间:2022-12-25 23:57:36

 

推荐地址:

http://www.cnblogs.com/U-tansuo/archive/2013/04/02/unity3d_memory_optimization.html

 

首先:Unity3d提供的Object.Destroy和Object.DestroyImmediately有什么区别呢?

 

有人在使用Destroy的时候说销毁的物体,但是他还存在于场景中(我没遇到过-.-),不过有这种可能,Destroy是暂时删掉组件的引用,如果内存够用,并不会在内存中直接删除,在下次加载这个这个组件的时候会更快,unity为了防止一个物体多次加载造成性能的浪费就给了这个接口,同时也是为了防止直接删除可能出现的一些问题。而Object.DestroyImmediately就是直接连内存删掉不多说。

         在开发项目尤其是2d项目,一般会用的NGUI那么问题就解决了,NGUI给了一个接口:NGUITools.Destroy函数,看看这个函数的内容:

         static public void Destroy(UnityEngine.Object obj)

         {

                   if (obj != null)

                   {

                            if (obj isTransform) obj = (obj as Transform).gameObject;

 

                            if (Application.isPlaying)

                            {

                                     if (obj isGameObject)

                                     {

                                              GameObjectgo = obj as GameObject;

                                              go.transform.parent= null;

                                     }

 

                                     UnityEngine.Object.Destroy(obj);

                            }

                            elseUnityEngine.Object.DestroyImmediate(obj);

                   }

         }

无疑是一种安全的方式

Destroy: 主要用于销毁克隆对象,也可以用于场景内的静态物体,不会自动释放该对象的所有引用。虽然也可以用于Asset,但是概念不一样要小心,如果用于销毁从文件加载的Asset对象会销毁相应的资源文件!但是如果销毁的AssetCopy的或者用脚本动态生成的,只会销毁内存对象。
   
AssetBundle.Unload(false):释放AssetBundle文件内存镜像
   
AssetBundle.Unload(true):释放AssetBundle文件内存镜像同时销毁所有已经LoadAssets内存对象
   
Reources.UnloadAsset(Object):显式的释放已加载的Asset对象,只能卸载磁盘文件加载的Asset对象
   
Resources.UnloadUnusedAssets:用于释放所有没有引用的Asset对象
   
GC.Collect()强制垃圾收集器立即释放内存 UnityGC功能不算好,没把握的时候就强制调用一下(这个东西占用CPU高,无论以何总方式,导致这个函数的出现,都有可能出现CPU使用过高而黑屏退出的现象,小心使用)