You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 03:42:52