写的程序需要频繁的发送HTTP请求与服务器通讯
IEnumerator Upload()
{
using (UnityWebRequest www = new UnityWebRequest("xxxxxx", "POST"))
{
using (var uploadHandlerRaw = new UploadHandlerRaw(Encoding.Default.GetBytes("{}")))
{
www.certificateHandler = new WebReqSkipCert();
www.uploadHandler = uploadHandlerRaw; //实例化上传缓存器
www.downloadHandler = new DownloadHandlerBuffer(); //实例化下载存贮器
www.SetRequestHeader("Content-Type", "application/json"); //更改内容类型,
yield return www.SendWebRequest();
if (www.result != UnityWebRequest.Result.Success)
{
Debug.Log(www.error);
}
else
{
dellist = new DelList();
// Debug.Log(www.downloadHandler.text);
Root root = JsonUtility.FromJson<Root>(www.downloadHandler.text);
for (int i = 0; i < root.data.Count; i++)
{
if (ShiJian != null)
{
ShiJian(root.data[i].msg);
}
print(root.data[i].msg);
dellist.id_array.Add(root.data[i].id);
}
StartCoroutine(IsDel());
}
www.uploadHandler.Dispose();
uploadHandlerRaw.Dispose();
www.disposeDownloadHandlerOnDispose = true;
www.disposeUploadHandlerOnDispose = true;
}
}
}
程序跑了两个小时之后发现内存被吃满了,一开始以为是texture没被删除掉,导致的贴图动态加载了之后,物体删除了,但纹理贴图没被删除并且还没触发GC回收
后面发现是发送HTTP请求的时候unity 官方会默认给我们new一个uploadHandler,但是这个uploadHandler却好像没被释放掉,难受的是unity编辑器也没报错内存泄漏,就只能一直排查,最后真机调试的时候报了一次内存泄漏,好像问题是HTTP请求失败的时候unity不会去主动触发uploadHandler.Dispose();导致内存一直在涨,搞得内存泄漏,记下这篇踩坑记录,给自己做个提醒
参考解决问题的文章:(5条消息) [已解决]Unity使用WebRequest过程中发生内存问题A Native Collection has not been disposed_Miner_W的博客-CSDN博客
谢谢上面这位大佬的帮助
题外再插一句,如果HTTP请求的问题照着上文做了结果还没解决问题,内存还在不断的被程序吃掉,请检查有没有频繁的去生成texture,记得生成了texture之后一定要去删除掉它!!!
if (GetComponent<RawImage>())
{
Texture tex = gameObject.GetComponent<RawImage>().texture;
if (tex != null)
{
Destroy(tex);
}
else
{
Debug.Log("leak texture");
}
}
记得在销毁rawimage的时候一定要去先卸载texture!!!切记!!!