最近发现一个问题,就是解决问题先百度一下,找别人的博客寻找答案,但有些时候总觉得不亲自实践,总不够自在,所以,还是自己多动动手,自己实践的东西,记下来,以后翻回来查找,这,或许更能记忆深刻吧
这里我用AssetBundle.LoadFromFile(path),来加载资源的情况,加载的资源是一个Gameobject,没有分开依赖,统一打包,选择不压缩打包
private void OnGUI()
{
if (GUI.Button(new Rect(0, 0, 100, 100), "步骤1"))
{
/*加载进来并不耗费内存,猜,存的只是一个地址,该步骤应该还包括解压文件,但是我打包的时候是不压缩的,所以速度很快.emoto是自定义文件,打包的时候你想什么
* 后缀都可以。*/
string path = Application.streamingAssetsPath + "/CannotDelete/0000000000000000___astronauts_man/astronauts_man/astronauts_man.emoto";
_ab = AssetBundle.LoadFromFile(path);
}
if (GUI.Button(new Rect(100, 0, 100, 100), "步骤2"))
{ /*到这一步才算是把资源放到内存中来,我们导入的是Gameobject,包括了贴图,材质,网格,音频,动画片段,加载完成之后记得卸载掉,ab已经完成了他的使命了
留着只会增加风险和出错*/
_go = _ab.LoadAsset<GameObject>("astronauts_man");
_ab.Unload(false);
_ab = null;
}
if (GUI.Button(new Rect(200, 0, 100, 100), "步骤3"))
{
/*实例化基本上都是引用,除了材质资源外,贴图基本上是引用,还有网格,所以,复制一个Gameobject基本上没消耗多大内存*/
_instsGo = Instantiate(_go);
}
if (GUI.Button(new Rect(300, 0, 100, 100), "步骤4"))
{
/*删除一个资源后,回收一些复制出来的资源,也不是很多*/
Destroy(_instsGo);
_instsGo = null;
}
if (GUI.Button(new Rect(400, 0, 100, 100), "步骤5"))
{
/*如果没有资源引用到源资源后,调用系统的卸载资源方法,系统将会卸载掉该资源,前提是源资源必须0引用*/
_go = null;
Resources.UnloadUnusedAssets();
}
}
这是没有执行步骤的内存情况
执行步骤1的内存情况,可以看到Assets数量从5271增加到5272,只是增加了一个对象,并没有增加内存
执行步骤2的内存情况
执行步骤3的内存情况,可以看到Assets数并没有增加,增加的是 Total Object Count 也就是复制的数据
执行步骤4的内存情况
执行步骤5的内存情况