资源加载方式有三种
1.
静态引用
2. 如何卸载Resources.Load()方式加载的资源,(Load以后instantiate)
Object obj = Resources.Load("MyPrefab");
GameObject instance = Instantiate(obj) as GameObject;
GameObject instance = Instantiate(obj) as GameObject;
....
....
Destroy(instance); //
销毁了一个Prefab实例,这时候 MyPrefab已经没有被实际的物体引用了
obj = null; // 让
变量obj不再引用
MyPrefab
Resources.UnloadUnusedAssets();//
释放已经没有引用的Asset
3. 如何卸载AssetBundle.Load()方式加载的资源,(Load以后instantiate)
AssetBundle AssetBundle1 = AssetBundle.CreateFromFile("1.unity3d");//存放于“镜像内存”中
obj1.renderer.material.mainTexture = AssetBundle1.Load("wall") as Texture;//存放于“主内存”中
//
obj2与obj1指向同一个Texture Asset
obj2.renderer.material.mainTexture = obj1.renderer.material.mainTexture;
如果
AssetBundle1.Unload(true);
那obj1和obj2都变成黑的了,因为指向的Texture Asset没了
//
关闭AssetBundle但没有摧毁创建的对象和引用
如果AssetBundle.Unload(false);
那obj1和obj2不变,只是
释放
AssetBundle1的
内存镜像
....
....
Destroy(obj1);
//obj1被释放,但并不会释放刚才Load的Texture
Resources.UnloadUnusedAssets();//
不会有任何内存释放 因为Texture asset还被obj2用着
Destroy(obj2);//
obj2被释放,但也不会释放刚才Load的Texture
Resources.UnloadUnusedAssets();//这时候
刚才load的Texture Asset释放了,因为没有任何引用了
GC.Collect(); //
强制立即释放内存
用AssetBundle加载的asset一样可以用Resources.UnloadUnusedAssets卸载,
但必须先AssetBundle.Unload,才会被识别为无用的asset
4. 场景切换
5.
a
.
Load的是Asset, 销毁时:Load的Asset要Unload
总结:
三种加载方式的区别:
静态引用 + Resouces.load()
引用对象texture是在instantiate时加载,
第一次instantiate时会包含加载引用 assets的操作,导致第一次加载的延迟
assetBundle.Load()
会把perfab的全部assets 都加载,instantiate时只是生成Clone
a. Destroy: 主要用于销毁克隆对象,也可以用于场景内的静态物体,不会自动释放该对象的所有引用。虽然也可以用于Asset,但是概念不一样要小心,如果用于销毁从文 件加载的Asset对象会销毁相应的资源文件!但是如果销毁的Asset是Copy的或者用脚本动态生成的,只会销毁内存对象。
b. AssetBundle.Unload(false):释放AssetBundle文件内存镜像
c. AssetBundle.Unload(true):释放AssetBundle文件内存镜像同时销毁所有已经Load的Assets内存对象
d. Reources.UnloadAsset(Object):显式的释放已加载的Asset对象,只能卸载磁盘文件加载的Asset对象
e. Resources.UnloadUnusedAssets:用于释放所有没有引用的Asset对象
f.
转摘自 http://blog.sina.com.cn/s/blog_74c22b2101019u9c.html