[已解决]Unity使用WebRequest过程中发生内存问题A Native Collection has not been disposed

这篇具有很好参考价值的文章主要介绍了[已解决]Unity使用WebRequest过程中发生内存问题A Native Collection has not been disposed。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题背景

Unity版本:2021.3.16

在用Unity做一个文字识别的应用,方案是用UnityWebRequest把图片发送给web api,但在发送一定时间后Unity会报错。

[已解决]Unity使用WebRequest过程中发生内存问题A Native Collection has not been disposed

(具体堆栈信息可以通过添加com.unity.entities包后开启堆栈追踪查看)

搜索试了不同的方法,后来在Unity Forum中一个帖子里找到了实际的原因和解决方案。

做了一些总结,该报错根据具体情况,可以尝试从以下几个方向解决:

报错原因1:UnityWebRequest没有释放。

解决方案:使用using把UnityWebRequest框起来,或者在使用完后调用Dispose()。

     using(UnityWebRequest www=new UnityWebRequest(webUrl))
     {
            // ....
            yield return www.SendWebRequest();
            // ....
     }

报错原因2: DownloadHandler或UploadHandler没有释放。

解决方案:设置两者随WebRequest一起释放,或者手动Dispose()。

        using(UnityWebRequest www=new UnityWebRequest(webUrl))
        {
            // ....
            yield return www.SendWebRequest();
            // ....

            www.disposeDownloadHandlerOnDispose = true;
            www.disposeUploadHandlerOnDispose = true;
        }

报错原因3:使用了自己定义的UploadHandle替换了创建WebRequest时创建的UploadHandle,而在释放时没有释放两者。

具体原因:参考UnityWebRequest.Post()方法中SetPost()的代码

        private static void SetupPost(UnityWebRequest request, string postData)
        {
            request.downloadHandler = new DownloadHandlerBuffer();
            if (!string.IsNullOrEmpty(postData))
            {
                byte[] array = null;
                string s = WWWTranscoder.DataEncode(postData, Encoding.UTF8);
                array = Encoding.UTF8.GetBytes(s);
                request.uploadHandler = new UploadHandlerRaw(array);
                request.uploadHandler.contentType = "application/x-www-form-urlencoded";
            }
        }

可以注意到使用UnityWebRequest.Post()时,会自动创建上传和下载的Handle并赋值给WebRequest的downloadHandler和uploadHandler属性

在实际使用时我们可能会替换掉WebRequest的这两个属性,同时在释放内存时只关注了替换后的downloadHandler和uploadHandler属性,导致原来的handler没有被释放,出现报错。

解决方案:在替换前先释放原有的uploadHandler/downloadHandler

        // 使用UnityWebRequest.Post()方法创建UnitywebRequest
        using (UnityWebRequest www = UnityWebRequest.Post(url, dataJson))
        {
            //设置请求的信息....            

            // 创建自己的uploadHandler,使用using语句保证自动释放
            using (var uploadHandlerRaw = new UploadHandlerRaw(bodyRaw))
            {
                // 释放使用UnityWebRequest.Post方法时创建的uploadHandler
                www.uploadHandler.Dispose();
                // 替换为自己创建的uploadHandler
                www.uploadHandler = uploadHandlerRaw;

                yield return www.SendWebRequest();
                
                // 处理请求的结果...

                // 保险起见再设置一下handler随WebRequest一起释放
                www.disposeDownloadHandlerOnDispose = true;
                www.disposeUploadHandlerOnDispose = true;
            }
        }

参考文章:A Native Collection has not been disposed, resulting in a memory leak. - Unity Forum文章来源地址https://www.toymoban.com/news/detail-449929.html

到了这里,关于[已解决]Unity使用WebRequest过程中发生内存问题A Native Collection has not been disposed的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 记录一下Unity使用过程中出现的问题

    1.(2022.3.16) 问题:Unity打开已存在的项目时,一直停留在Hold on... Importing assests界面。 原因及解决方案:Unity Hub中项目设置的默认位置带有中文,将其修改为不含中文的路径即可。 (更新) 重新打开又出现类似问题,一使用VS进行脚本编辑时再次出现加载框,尝试先打开V

    2024年02月08日
    浏览(47)
  • Unity关于本地加载图片涉及webrequest或者byte

    Unity关于本地加载图片的有2种,一种使用webrequest发送请求发送数据将得到的数据转换成Texture2d,最后转换成sprite,第二种方法是使用读取文本文件方法 将图片当成文件来读取,然后转换成,下边附上我的代码

    2024年02月15日
    浏览(36)
  • Unity连接数据库mysql全过程+可能遇到的问题与解决方案

    目录 一、具备条件 二、unity连接mysql 三、问题总结 1. Mysql安装完成         安装完成后需要查看mysql的版本,打开终端(管理者身份运行),输入以下语句登录mysql,查看MySQL版本; 可以看到我下载的版本是 5.7.38; 2. MySQL Connector/NET下载 目的:为了搭建unity连接mysql的环境

    2024年02月03日
    浏览(63)
  • “已成功与服务器建立连接,但是在登录过程中发生错误“的解决方法

    对于上述问题,我也曾被折磨得不轻。 网上找了很多方法,很多就是每个屁用! 别轻易就重新注册一个新的,否则后面可能还需要花时间去把它删了。 首先,我们会看到连接成功但是登陆不上的报错图。  电脑不同,可能也会有所不同。但大致内容就是上述那样。 方法一:

    2024年02月06日
    浏览(128)
  • [Unity3D] 记录一下ScrollView中粒子无法被Mask遮挡的问题解决过程

    项目解决问题1所使用的Shader链接:https://www.codenong.com/cs107033982/ 解决思路: 1、粒子特效使用的Mobile/Particles/Additive(Shader)材质球不包含模板测试,添加模板测试后可以与普通Image一样被Mask遮挡,所以我们给粒子的材质球加上模板测试。 2、普通Image使用默认的材质球,该材质球

    2024年02月07日
    浏览(46)
  • Unity打包WebGL的全过程及在打包和使用过程中会遇到的问题

    目录 概要 Unity打包WebGL PlayerSettings设置 Resolution and Presentation Other Settings  Publishing Settings 本地服务器测试环境配置 问题盘点         盘点Unity在Build WebGL环境包时需要的配置以及遇到的难题 Resolution and Presentation Resolution and Presentation 界面主要设置打包后的WebGL界面的分辨率显

    2024年02月16日
    浏览(34)
  • 【Android】 频繁刷新 RecyclerView导致View 对象引用过多引起的Native 内存占用过大解决办法

    在 RecyclerView 中,如果频繁刷新 RecyclerView,可能会导致 Native 内存中有大量的 TextView 对象,从而导致内存占用过多的问题。以下是一些可能导致该问题的原因和解决方法: 使用 ViewHolder 在 RecyclerView 中,使用 ViewHolder 可以避免频繁创建和销毁 View 对象,从而减少内存占用。可

    2024年02月08日
    浏览(72)
  • Unity打包WebGL的全过程及在打包和使用过程中会遇到的问题(本地测试)

    目录 概要 Unity打包WebGL PlayerSettings设置 Resolution and Presentation Other Settings  Publishing Settings 本地服务器测试环境配置 问题盘点         盘点Unity在Build WebGL环境包时需要的配置以及遇到的难题 Resolution and Presentation Resolution and Presentation 界面主要设置打包后的WebGL界面的分辨率显

    2024年02月05日
    浏览(93)
  • Redis内存使用率高,内存不足问题排查和解决

    表面现象是系统登录突然失效,排查原因发现,使用redis查询用户信息异常,从而定位到redis问题 我的redis使用的是华为云的redis分布式缓存服务,所以在问题排查方面,我们可以结合华为云提供的丰富的分析诊断工具来辅助排查解决问题。 1、问题定位到redis上,登陆redis服务

    2024年02月03日
    浏览(42)
  • 使用GraalVM native-image 编译SpringBoot3全过程

    本文记录了使用native-image编译SpringBoot3.0.3的过程及遇到的问题。其中一些问题也是网上很多朋友遇到,我在实际操作的过程也遇到过同样的问题,在此做一记录。 目录 一、编译环境准备 1.1 安装GraalVM 1.2 安装native-image 1.3 IDE设置 1.4 Visual Studio 2022 1.5 pom.xml文件 二、使用nati

    2024年02月11日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包