资源载入方式有三种
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的或者用脚本动态生成的。仅仅会销毁内存对象。