一、加载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