20.Resources卸载资源

20.Resources资源动态加载-Resources卸载资源


20.1 知识点

Resources重复加载资源会浪费内存吗?

  • 其实Resources加载一次资源过后
  • 该资源就一直存放在内存中作为缓存
  • 第二次加载时发现缓存中存在该资源
  • 会直接取出来进行使用
  • 所以,多次重复加载不会浪费内存
  • 但是会浪费性能(每次加载都会去查找取出,始终伴随一些性能消耗)

手动释放掉缓存中的资源

Resources中的UnloadAsset方法 卸载指定资源

//从内存中卸载 / assetToUnload /
//注意:
//该方法 不能释放 GameObject对象 因为它会用于实例化对象
//它只能用于一些 不需要实例化的内容 比如 图片 和 音效 文本等等
//一般情况下 我们很少单独使用它
//GameObject obj = Resources.CoroutineAsynLoad<GameObject>("Cube")
//即使是没有实例化的 GameObject对象也不能进行卸载
//Resources.UnloadAsset(obj);//报错 不能卸载GameObject

Resources中的UnloadUnusedAssets方法 卸载未使用的资源

//卸载未使用的资源。
//注意:一般在过场景时和GC一起使用
Resources.UnloadUnusedAssets();
GC.Collect();

打开调试窗口,按下按键,可以查看加载图片和卸载图片内存的变化,重复按下加载,内存还是不会变化




void Update()
{
    //加载卸载不是GameObject可以正常使用
    //按键加载卸载指定资源,查看变化
    if (Input.GetKeyDown(KeyCode.Alpha1))
    {
        print("加载资源");
        tex = Resources.Load<Texture>("Tex/TestJPG");
    }
    if (Input.GetKeyDown(KeyCode.Alpha2))
    {
        print("卸载资源");
        Resources.UnloadAsset(tex);
        tex = null;
    }
}

总结

  • Resources.UnloadAsset 卸载指定资源,但是不能卸载GameObject对象
  • Resources.UnloadUnusedAssets 卸载未使用资源,一般过场景时配合GC使用

20.2 知识点代码

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Lesson20_Resources资源动态加载_Resources卸载资源 : MonoBehaviour
{
    private Texture tex;
    
    void Start()
    {
        #region 知识点一 Resources重复加载资源会浪费内存吗?
        //其实Resources加载一次资源过后
        //该资源就一直存放在内存中作为缓存
        //第二次加载时发现缓存中存在该资源
        //会直接取出来进行使用
        //所以 多次重复加载不会浪费内存
        //但是 会浪费性能(每次加载都会去查找取出,始终伴随一些性能消耗)

        #endregion

        #region 知识点二 如何手动释放掉缓存中的资源
        //Resources中的UnloadAsset方法 卸载指定资源
        //从内存中卸载 / assetToUnload /。
        //注意:
        //该方法 不能释放 GameObject对象 因为它会用于实例化对象
        //它只能用于一些 不需要实例化的内容 比如 图片 和 音效 文本等等
        //一般情况下 我们很少单独使用它
        //GameObject obj = Resources.CoroutineAsynLoad<GameObject>("Cube");
        //即使是没有实例化的 GameObject对象也不能进行卸载
        //Resources.UnloadAsset(obj);//报错 不能卸载GameObject

        //Resources中的UnloadUnusedAssets方法 卸载未使用的资源
        //卸载未使用的资源。
        //注意:一般在过场景时和GC一起使用
        Resources.UnloadUnusedAssets();
        GC.Collect();

        #endregion

        #region 总结
        //Resources.UnloadAsset 卸载指定资源 但是不能卸载GameObject对象
        //Resources.UnloadUnusedAssets 卸载未使用资源 一般过场景时配合GC使用
        #endregion
    }
    
    void Update()
    {
        //加载卸载不是GameObject可以正常使用

        //按键加载卸载指定资源,查看变化

        if (Input.GetKeyDown(KeyCode.Alpha1))
        {
            print("加载资源");
            tex = Resources.Load<Texture>("Tex/TestJPG");
        }
        if (Input.GetKeyDown(KeyCode.Alpha2))
        {
            print("卸载资源");
            Resources.UnloadAsset(tex);
            tex = null;
        }
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏