Unity 热更新学习笔记二:异步加载

在学习异步加载前应该学习一下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

来实现更方便的协程控制以及提高效率。

posted @ 2023-05-15 10:45  CatSevenMillion  阅读(437)  评论(0)    收藏  举报