首页 > 其他分享 >unity3d————Resources异步加载

unity3d————Resources异步加载

时间:2024-11-15 13:47:54浏览次数:3  
标签:unity3d rq 异步 tex 资源 Resources 加载

知识点一:Resources异步加载是什么?

在Unity中,资源加载可以分为同步加载和异步加载两种方式。同步加载会在主线程中直接进行,如果加载的资源过大,可能会导致程序卡顿,因为从硬盘读取数据到内存并进行处理是需要时间的。而异步加载则是Unity内部新开一个线程进行资源加载,这样就不会造成主线程卡顿,从而提高应用的响应性和流畅性。

知识点二:Resources异步加载方法

1. 通过异步加载中的完成事件监听使用加载的资源
  • 方法:使用Resources.LoadAsync<T>()方法进行异步加载,并通过监听completed事件来获取加载完成的通知。
  • 示例
    ResourceRequest rq = Resources.LoadAsync<Texture>("Tex/TestJPG");
    rq.completed += LoadOver; // 注册完成事件
  • 注意:异步加载不能马上得到加载的资源,至少要等一帧。因此,在completed事件触发之前尝试访问rq.asset是错误的。
2. 通过协程使用加载的资源
  • 方法:在协程中使用Resources.LoadAsync<T>()方法,并通过yield return语句等待资源加载完成。
  • 示例
    IEnumerator Load()
    {
    ResourceRequest rq = Resources.LoadAsync<Texture>("Tex/TestJPG");
    yield return rq; // 等待资源加载完成
    tex = rq.asset as Texture; // 获取加载的资源
    }
  • 优点:协程允许在加载资源的同时处理其他逻辑,如更新进度条或同时加载多个资源。
  • 缺点:写法相对复杂一些。

代码讲解

1.通过完成事件监听使用加载的资源(线程方式)
private Texture tex; // 声明一个Texture变量用于存储加载的资源

    void Start()
    {
        // 使用Resources.LoadAsync<T>()方法进行异步加载
        ResourceRequest rq = Resources.LoadAsync<Texture>("bk");

        // 注册完成事件,当加载结束时调用LoadOver方法
        rq.completed += LoadOver;
        print(Time.frameCount);
    }

    // 完成事件的回调函数
    private void LoadOver(AsyncOperation operation)
    {
        // 获取加载的资源
        tex = (operation as ResourceRequest).asset as Texture;

        // 输出加载完成的通知和当前帧数
        print("加载结束");
        print(Time.frameCount);
    }

    private void OnGUI()
    {
        // 在GUI中绘制加载的纹理
        if (tex != null)
            GUI.DrawTexture(new Rect(0, 0, 100, 100), tex);
    }private Texture tex; // 声明一个Texture变量用于存储加载的资源

    void Start()
    {
        // 使用Resources.LoadAsync<T>()方法进行异步加载
        ResourceRequest rq = Resources.LoadAsync<Texture>("bk");

        // 注册完成事件,当加载结束时调用LoadOver方法
        rq.completed += LoadOver;
        print(Time.frameCount);
    }

    // 完成事件的回调函数
    private void LoadOver(AsyncOperation operation)
    {
        // 获取加载的资源
        tex = (operation as ResourceRequest).asset as Texture;

        // 输出加载完成的通知和当前帧数
        print("加载结束");
        print(Time.frameCount);
    }

    private void OnGUI()
    {
        // 在GUI中绘制加载的纹理
        if (tex != null)
            GUI.DrawTexture(new Rect(0, 0, 100, 100), tex);
    }
 2.通过协程使用加载的资源(协程方式)
private Texture tex; // 声明一个Texture变量用于存储加载的资源

    void Start()
    {
        // 使用协程进行异步加载
        StartCoroutine(Load());
    }

    IEnumerator Load()
    {
        // 使用Resources.LoadAsync<T>()方法进行异步加载
        ResourceRequest rq = Resources.LoadAsync<Texture>("bk");

        // 输出当前帧数以观察异步加载的效果
        print(Time.frameCount);

        // 等待资源加载完成
        yield return rq;

        // 输出加载完成的通知和当前帧数
        print(Time.frameCount);

        // 获取加载的资源
        tex = rq.asset as Texture;

        // 这里可以添加额外的逻辑,如更新UI或处理加载后的资源
    }

    private void OnGUI()
    {
        // 在GUI中绘制加载的纹理
        if (tex != null)
            GUI.DrawTexture(new Rect(0, 0, 100, 100), tex);
    }
结果:

                                           

总结

  • 异步加载:通过新开线程进行资源加载,避免主线程卡顿。
  • 完成事件监听:写法简单,但只能在资源加载结束后进行处理。
  • 协程异步加载:允许在加载资源的同时处理其他逻辑,写法相对复杂。
  • 注意:异步加载不能马上得到加载的资源,需要等待加载完成。

 

标签:unity3d,rq,异步,tex,资源,Resources,加载
From: https://blog.csdn.net/2401_82978699/article/details/143796883

相关文章

  • React setState是异步吗?
     React官网对于setState的说明:将setState()认为是一次请求而不是一次立即执行更新组件的命令。为了更为可观的性能,React可能会推迟它,稍后会一次性更新这些组件。React不会保证在setState之后,能够立刻拿到改变的结果。以上说明执行setState时,有可能是异步(大部分情况下)更新......
  • 异步学习小例子
    voidTest1(){ChangeText("==========================================================");ChangeText("iamwashingleftnow...");}//执行Test方法为Test线程asyncvoidTest()......
  • stringRedisTemplate 异步操作的问题记录
    一、问题背景StringRedisTemplate使用stringRedisTemplate.opsForValue().set时,会出现set之后立马get获取值,发现获取不到set进去的值。二、问题原因1、在使用redisson的情况下,stringRedisTemplate.opsForValue().set操作会是异步操作,造成。你在set之后,立马get获取值的时候会......
  • 【FastAPI】解决下载文件预处理时间较长的问题:FastAPI 实现异步任务处理
    解决下载文件预处理时间较长的问题:FastAPI实现异步任务处理在开发Web应用时,我们经常会遇到需要对文件进行预处理的场景。例如,用户请求下载一个文件之前,需要进行压缩、转换或者数据处理等操作。然而,这些预处理任务往往会花费较长时间,如果我们在后端直接处理这些任务,会导......
  • Java8 CompletableFuture异步任务
    无返回值调用importjava.util.concurrent.CompletableFuture;publicclassTestDemo{publicstaticvoidmain(String[]args){System.out.println("进入主线程=============");CompletableFuture.runAsync(()->getNum());System.......
  • 深入理解Spring框架中的@Async注解实现异步任务
    目录1.引言2.环境准备3.启用异步支持4.创建异步任务5.调用异步任务6.运行应用7.使用@Async需要注意的地方8.结论在现代Web应用中,异步任务的执行变得越来越重要。Spring框架提供了强大的@Async注解,可以帮助开发者轻松实现异步任务。本文将详细介绍如何在Sprin......
  • 同步异步,阻塞非阻塞
    同步异步,阻塞非阻塞区别: 同步:调用者发出请求后,一直等待被调用者返回结果或通知,才进行下一步操作。 异步:调用者发出请求后,不等待被调用者返回结果或通知,就进行下一步操作。阻塞:调用者发出请求后,被调用者不返回结果或通知,调用者就一直等待,不能进行其他操作。 非阻塞:调用者发出请......
  • 【Nginx学习】深入 Nginx:4大步骤揭秘 Nginx 请求的多阶段异步处理
    ......
  • Vue功能菜单的异步加载、动态渲染
            实际的Vue应用中,常常需要提供功能菜单,例如:文件下载、用户注册、数据采集、信息查询等等。每个功能菜单项,对应某个.vue组件。下面的代码,提供了一种独特的异步加载、动态渲染功能菜单的构建方法:<scriptsetup>import{defineComponent,getCurrentInstance,h}......
  • 异步电动机的直接转矩控制系统
    异步电动机的直接转矩控制系统(DTC)是一种高性能的交流电机调速技术,通过直接控制电机的瞬时电压来控制电机定子磁链的瞬时旋转速度。以下是对异步电动机的直接转矩控制系统的详细介绍:基本原理基本思想:直接转矩控制的基本思想是根据定子磁链幅值偏差和电磁转矩偏差的正负符号,再......