首页 > 其他分享 >Unity 热更新学习笔记二:异步加载

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

时间:2023-05-15 10:57:29浏览次数:35  
标签:异步 ab 协程 Unity 内存 path 加载

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

相关文章

  • 20230515学习笔记——js中的同步任务与异步任务,宏任务与微任务
    2023-05-15(1)js中的同步任务与异步任务①同步任务是指:不耗时的任务,就是执行很快,②异步任务是指:耗时的任务,它里面有一个机制是EventLoop(事件循环),即值耗时任务会被js分配到宿主环境中进行执行,执行后的结果放到一个“消息队列”中,当js将同步任务执行完毕后,才会调用异步环境。在消......
  • ET框架6.0分析二、异步编程
    概述ET框架很多地方都用到了异步,例如资源加载、AI、Actor模型等等。ET框架对C#的异步操作进行了一定程度的封装和改造,有一些特点:显式的或者说强调了使用C#异步实现协程机制(其实C#的异步编程天生就能实现这种用法)强制单线程异步没有使用C#库的Task,自己实现了ETTask等类实现了......
  • 【SpringBoot】【配置加载】 SpringBoot配置加载解析时机原理
    1 前言不知道大家对于配置文件的加载有没有考虑过是什么时候加载解析的,这节我们就来看看。2 执行入口我们就先来看看加载配置的入口,核心类就是 ConfigFileApplicationListener主要作用就是读取应用的配置文件并add到Environment的PropertySources列表里。那么实际的执行过......
  • 电机控制器,异步电机的旋转高频电压注入算法FOC,全套C代码+仿真模型,已经在实际的工程项
    电机控制器,异步电机的旋转高频电压注入算法FOC,全套C代码+仿真模型,已经在实际的工程项目项目中加以应用:1.在定子电压的两相同步静止坐标系(α,β轴)下注入旋转高频电压,然后通过转子位置观测器实现转子机械转速与转子磁链电角度的精确估算;2.能够实现电机低速段带重载运行工况下的高精......
  • 【Azure 应用服务】Azure JS Function 异步方法中执行SQL查询后,Callback函数中日志无
    Warning:Unexpectedcallto'log'onthecontextobjectafterfunctionexecutionhascompleted.Pleasecheckforasynchronouscallsthatarenotawaitedorcallsto'done'madebeforefunctionexecutioncompletes.Th......
  • Fegin异步情况下丢失上下文问题
    问题:Order服务需要远程调用member服务进而查询所有的地址列表,也需要远程调用cart服务进而查询购物车所有选中的购物项,串行执行远程调用会浪费大量时间,因此我们进行异步编排优化@Override  publicOrderConfirmVoconfirmOrder()throwsExecutionException,InterruptedExc......
  • 深入理解 JVM —— 类加载及执行子系统案例
    Tomcat——正统的类加载器结构为一个功能健全的Web服务器,都要解决如下的这些问题:部署在同一个服务器上的 两个Web应用程序 所使用的 Java类库可以实现相互隔离。这是最基本的需求,两个不同的应用程序可能会依赖同一个第三方类库的不同版本,不能要求每个类库在一个服务器中......
  • IIS首次打开加载慢,配置预加载
    1.网站-高级设置,启用预加载 2.应用程序池,启动模式设置为AlwaysRunning3.站点-配置编辑器,doAppInitAfterRestart设置为True添加集合:initializationPage设置为/home ......
  • C# Winform 界面操作异步回调 AsyncCallback
    usingSystem;usingSystem.Collections.Generic;usingSystem.Threading;usingSystem.Windows.Forms;namespaceWindowsFormsApp1{publicpartialclassForm1:Form{publicForm1(){InitializeComponent();m......
  • Springboot 开启异步任务Async,邮件发送任务,定时任务
    异步任务1.主启动类开启异步注解 2.service目录下开启异步任务注解@ServicepublicclassAsyncService{@Async//异步任务注解的标志publicvoidhello(){try{Thread.sleep(3000);}catch(InterruptedExceptione){......