知识点一: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);
    }
 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);
    }
结果:

                                           

总结

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

更多推荐