IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 异步加载的方式比较 -> 正文阅读

[游戏开发]异步加载的方式比较

异步加载的方式目前知道的有三种:

  • 协程
  • Await
  • 多线程

协程

同个功能的多次缓慢加载但只取其中一个

之前协程加载AssetBundle或者网络下载的时候,惯例写法是传入回调。
当同一个模块对某个功能多次发起这种异步加载的方式的时候,可能加载回来很多个之后,
只有一个是他需要的,那么这时为了防止同个功能加载多个资源但是这些资源加载完成时序不确定然后导致最后使用到最后加载完成的资源情况,
他需要在加载时候多传入一个资源标识符,他自己本身持唯一一个标识符。当有多个资源都加载完成的时候,
完成回调中调用加载函数传入时顺带传参进来的标识符。

树形依赖资源的加载

有依赖关系的资源会分开打包,例如1和2都依赖3,然后不依赖打包的话,可能全部打包到一起。
在实际商业项目中,往往不会一开始就将程序所有的ab包加载到内存,这样可能会内存过大 所以实际项目都是ab包分开打包。
所以,1和2如果要加载都要先加载好3.
所以ab包会有依赖关系。

协程这种方法还有个问题是如果资源是多层嵌套依赖的方式,就有比较难处理。
例如加载好A需要加载好B和C,加载好B需要加载好D和E,加载C需要加载好F和G
这种树形结构方式的资源结构。

这里ABCDEFG都是assetbundle资源
那么协程对这种情况的处理方式是
先加载G和F,G和F每个加载完成都有一个对应变量标志位改变, 每次G或者F都加载好之后都有判断是否所有标志位都好了,
当G和F都加载好之后,才去加载 D。其他都是这样。
如果没有专门的计数引用工具,这种逻辑就会写的比较繁琐,并且依赖关系更改之后,这些代码也要进行更改。

协程的直接使用适合没有嵌套结构,并且不会同一个功能需要短时间多次加载资源,并且只取其中一个资源的情况。
否则就需要进行一些只针对项目业务的程度有些大的更改。

Await

await的方式,让开发人员用处理同步代码的方式进行好了异步的处理。

async和await需要同时在一个方法出现,如下所示

 async void ReadText()
    {
        Task<string> task = AsyncLoadText("test.txt");
        await task;
        Debug.Log(task.Result);
    }

声明了async 的函数要么返回值是void要么是Task或者Task泛型类型。

    void Start()
    {
        ReadText();
    }

    async void ReadText()
    {
        Task<string> task = AsyncLoadText("test.txt");
        await task;
        Debug.Log(task.Result);
    }

    async Task<string> AsyncLoadText(string url)
    {
        string path = Path.Combine(Application.streamingAssetsPath, url);
        UnityWebRequest getRequest = UnityWebRequest.Get(path);
        await getRequest.SendWebRequest();
        string text = getRequest.downloadHandler.text;
        return text;
    }

只有声明了async的函数才能使用await。

调用await操作的异步函数最外层的方法也是用async声明的,
在其他模块调用这个异步的入口部分,也是要传入一个回调函数。

使用Await的方式等待协程,需要对unity本身的协程函数的返回值进行一次封装。
github上面已经有对此的较为全面的封装,可以下载使用,地址是
svermeulen/Unity3dAsyncAwaitUtil

或者从这里下载

同个功能的多次缓慢加载但只取其中一个

因为最后await最外层还是要传入一个回调,根据回调来使用加载好的东西。
所以这样的使用最后还是要判断加载好的东西是否是当前自己需要的。
所以其他模块调用Await加载模块这个部分还是要根据标志位来判断是否是自己想要的加载动物。

树形依赖资源的加载

await可以说是专门针对这种依赖加载的情况而生,顺序的代码结构使依赖加载可以轻松完成。

针对上述的情况,这里只需要
先加载G和F,await等待G和F加载结束 然后加载C, await等待C结束;
然后加载D和E,await等待D和E加载结束 然后加载B, await等待B结束;
最后再加载A。

使用方法参考:
Unity 中的 async-await 咋用

多线程

Unity的所有API包括,异步加载API,包括Addressable和Assetbundle类的,都不能在多线程中使用,一些其他线程,例如Unity提供的多线程编程例如,Job线程,使用不清楚。

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-05-05 11:52:21  更:2022-05-05 11:54:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 10:24:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码