目前untiyAPI 提供网络请求图片方式有两种
- WWW
2.UnityWebRequest
第一种 www 下载图片避免内存泄漏
首先 请求部分
IEnumerator Request(Action<Texture2D > action)
{
WWW www = new WWW("url");
yield return www;//等待Web服务器的反应
if (www.error != null)
{
Debug.Log( www.error);
yield return null;
}
action( www.texture);
}
第二部分 给RawImage 赋值 这部分 尤为重要,处理不好会内存泄漏
RawImage rawImage;
第一种:
void Create(Texture2D t)
{
//先销毁Texture
Destory( rawImage);
rawImage.texture=t;
}
这种方式是先将rawImage 引用的Texture销毁,再引用新的Texture2D,内存不会泄露
UnityWebRequest 下载方式:要注意会有两处引起内存泄漏的地方
这种方式 如果使用UnityWebRequest GetTexture 会引起内存泄漏,这是引擎本身的bug
可以去源码 ,unity 在销毁UnityWebRequest 没有销毁DownloadHandlerTexture引用的
mTexture,就会造成 每次新的下载都会引起内存泄漏,这是其中一种,第二种就是大家常见的
图片赋值管理不当引起的内存泄漏
IEnumerator Request(Action<byte[] > action)
{
UnityWebRequest request = new UnityWebRequest(url, UnityWebRequest.kHttpVerbGET);
request.downloadHandler =new DownloadHandlerBuffer();
yield return request.SendWebRequest();
aciont( request.downloadHandler.data);
}
定义全局变量 Texture2D cachTex;
初始化cachTex 在Start 或者Awake函数中调用
void Init()
{
cachTex =new Texture2D(2,2);
rawImage.texture = cachTexture;
}
//接收数据
void Create(byte[] bs)
{
cachTex .LoadImage(bs);
cachTex .Apply();
}
OnDestory()时销毁 cachTex
Destory(cachTex)
这种方式也不会造成内存泄漏
网友评论