Unity中加载Texture2D不断消耗内存的问题

一、加载Texture2D显示图片

游戏项目中,我们经常需要通过网络加载图片,比如用户头像、背景图,也可能是加载本地的某个图片,比如截屏图,一般我们会用一个Texture2D来显示这个图片。

二、案例

比如我这里,从StreamingAssets中加载一张背景图
在这里插入图片描述
代码如下:

using System.Collections;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;

public class Main : MonoBehaviour
{
    
    
    public Button loadTexturebtn;
    public RawImage rawImage;

    void Awake()
    {
    
    
        loadTexturebtn.onClick.AddListener(() =>
        {
    
    
            StartCoroutine(LoadTexture());
        });
    }

    IEnumerator LoadTexture()
    {
    
    
        var url = Application.streamingAssetsPath + "/bg.png";
#if UNITY_EDITOR
        url = "file:///" + url;
#endif
        UnityWebRequest uwr = UnityWebRequest.Get(url);
        yield return uwr.SendWebRequest();

        if (uwr.isNetworkError || uwr.isHttpError)
        {
    
    
            Debug.Log(uwr.error);
            yield break;
        }
        while (!uwr.isDone)
        {
    
    
            yield return null;
        }

        var data = uwr.downloadHandler.data;
        //这里,就会在内存中申请空间了
        Texture2D texture = new Texture2D(rawImage.mainTexture.width, rawImage.mainTexture.height);
        texture.LoadImage(data);
        rawImage.texture = texture;
    }
}

三、内存分析

我们new了一个Texture2D,然后赋值给RawImage显示,如果我们不断得点击Load Texture按钮,就会不断地执行加载,不断地new Texture2D,导致不断地申请内存空间,我们可以通过Memory Profile看看内存情况,我点击了30次Load Texture按钮,内存中申请了30个Texture2D,并且没有释放掉,即使我把RawImage销毁掉,内存中依然会存放那30个Texture2D
在这里插入图片描述

四、如何释放内存

1、错误示范

销毁RawImage,然后隔一帧,调用Resources.UnloadUnusedAssets();
在这里插入图片描述

经过测试,这样是不能释放内存的,内存中依然存着Texture2D
在这里插入图片描述

2、正确示范

直接销毁Texture2D
在这里插入图片描述

可以看到,内存中释放了Texture2D
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/linxinfa/article/details/108347571