微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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(() @H_404_123@=@H_404_123@>
        {
            StartCoroutine(LoadTexture());
        });
    }

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

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

        var data @H_404_123@= uwr.downloadHandler.data;
        //这里,就会在内存中申请空间了
        Texture2D texture @H_404_123@= new Texture2D(rawImage.mainTexture.width, rawImage.mainTexture.height);
        texture.LoadImage(data);
        rawImage.texture @H_404_123@= 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

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐