在学习异步加载前应该学习一下Untiy中如何进行性能分析
为什么热更新要学习性能分析?
在热更新的过程其实也就是一种资源加载的过程,而涉及到资源加载就不得不提性能分析。因为资源的加载通常是异步加载的,如果把资源都统合在一起加载游戏界面就会卡住,这是我们不希望发生的事情。
Untiy中的性能分析工具有Profiler。打开方式 Window->Analysis->proflier.
Profiler为我们提供了包括CPU,渲染,内存,音频,物理,UI,网络,光线追踪等的性能实时消耗情况。
界面如下:
为了测试AB包性能,我们设置几个按钮如下:
public void LoadFile() { string path = Application.dataPath; Debug.Log(path); path = path.Substring(0, path.Length - 6) + "ab"; Debug.Log(path); ab = AssetBundle.LoadFromFile(path+"/imgs"); } public void LoadImage() { img.sprite = ab.LoadAsset<Sprite>("UsingImage"); } public void UnloadFile() { //参数:是否将已经加载的资源连同包一起卸载。 ab.Unload(false); }
通过测试我们可以看出,ab,Unload函数当参数设置为true时,ab包的资源才会在内存中被释放,而当设置为false时,当我们卸载了ab包之后,sprite依然停留在内存中,且当新的sprite赋值给image时,这个对象不会被销毁。这是非常危险的,当游戏中大量出现这样的问题就会引发内存泄漏。
但是我们的实际需求又是需要我们的ab包卸载之后图片依然停留在内存中的,不然ab包本身来说对内存也是一个不小的负担。所以我们可以使用:
Resources.UnloadUnusedAssets();
用来卸载内存中停留的未使用的资源。
实现资源异步加载:
资源的异步加载通过上面已经知道了也就是需要顺序调用 1.AB包的加载,2.资源的加载
在C#中想要实现代码调用这个过程我们就要使用协程:
IEnumerator LoadImage() { AssetBundleCreateRequest ab = AssetBundle.LoadFromFileAsync(Path); yield return ab; img.sprite = ab.assetBundle.LoadAsset<Sprite>("使用图片"); }
这里应该也是我博客里面第一次使用到协程,顺手也写一写自己对协程的理解吧。
协程返回的是一个IEnumerator 迭代器,其返回值可以自行查阅,无非都是等待异步操作执行,等待一定的时间,等待其他事件完成这些操作。
就上述代码来说,ab的类型是AssetBundleCreateRequest就是一个异步操作,协程中 yield return ab 的后续所有代码都会等待ab完成之后才会继续执行。
值得注意的是:协程的效率并不是很高,尤其是当程序中有多个协程存在时,在公司中通常会使用插件:More Effective Coroutines Pro
来实现更方便的协程控制以及提高效率。
标签:异步,ab,协程,Unity,内存,path,加载 From: https://www.cnblogs.com/CatSevenMillion/p/17395997.html