UnityWebRequest内存泄漏求助:点击统计引发Native Collection未释放问题
UnityWebRequest内存泄漏问题解决
问题根源
你的内存泄漏是因为UnityWebRequest使用后未释放Native资源。错误日志指向UploadHandlerRaw的NativeArray未被销毁,这是因为UnityWebRequest内部的上传/下载处理器持有Native内存,必须手动调用Dispose()或通过using语句自动释放。
另外,EndItAll中的StopCoroutine(PostRequest())是无效操作:你需要传入启动协程时返回的Coroutine对象才能停止,直接传入方法名无法定位到正在运行的协程实例,且此时协程已经执行到请求完成阶段,无需停止。
修复后的代码
修改PostRequest协程(使用using自动释放资源)
IEnumerator PostRequest() { const string url = "http://catstats.local/catstats.php"; const string game = "bugs"; WWWForm form = new WWWForm(); form.AddField("game", game); form.AddField("type", bug.bugType); form.AddField("scale", bug.scale.ToString()); form.AddField("speed", saveSpeed.ToString()); form.AddField("spawnNumber", bug.spawnNumber.ToString()); form.AddField("dirX", bug.dirX.ToString()); form.AddField("x", bug.x.ToString()); form.AddField("y", bug.y.ToString()); // 使用using语句包裹UnityWebRequest,自动调用Dispose释放资源 using (UnityWebRequest uwr = UnityWebRequest.Post(url, form)) { yield return uwr.SendWebRequest(); if (uwr.result == UnityWebRequest.Result.Success) { Debug.Log("Data Sent: " + uwr.downloadHandler.text); } else { Debug.Log("Error sending: " + uwr.error); } } // 请求完成后统一销毁对象 EndItAll(); }
简化EndItAll方法
private void EndItAll() { Destroy(gameObject); }
关键说明
using语句会在代码块执行完毕后自动调用UnityWebRequest.Dispose(),彻底释放其持有的Native内存、上传/下载处理器等资源,从根源解决内存泄漏。- 无论请求成功或失败,
using块都会确保资源被释放,比手动在分支中调用Dispose()更可靠。
内容的提问来源于stack exchange,提问作者swmcdonnell
相关产品推荐
相关产品推荐

