[已解决]Unity使用WebRequest过程中发生内存问题A Native Collection has not been disposed
问题背景
Unity版本:2021.3.16
在用Unity做一个文字识别的应用,方案是用UnityWebRequest把图片发送给web api,但在发送一定时间后Unity会报错。
(具体堆栈信息可以通过添加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()方法创建UnitywebRequestusing (UnityWebRequest www = UnityWebRequest.Post(url, dataJson)){//设置请求的信息.... // 创建自己的uploadHandler,使用using语句保证自动释放using (var uploadHandlerRaw = new UploadHandlerRaw(bodyRaw)){// 释放使用UnityWebRequest.Post方法时创建的uploadHandlerwww.uploadHandler.Dispose();// 替换为自己创建的uploadHandlerwww.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
[已解决]Unity使用WebRequest过程中发生内存问题A Native Collection has not been disposed相关推荐
- python吃显卡还是内存不足_解决pytorch GPU 计算过程中出现内存耗尽的问题
Pytorch GPU运算过程中会出现:"cuda runtime error(2): out of memory"这样的错误.通常,这种错误是由于在循环中使用全局变量当做累加器, ...
- 已成功与服务器建立连接,但是在登录过程中发生错误。 (provider: SSL Provider, error: 0 - 接收到的消息异常,或格式不正确。)...
之前做好的asp.net部署后,发现 访问数据库时: 异常:已捕获: "已成功与服务器建立连接,但是在登录过程中发生错误. (provider: SSL Provider, error: 0 ...
- SQL Server 2008 问题——已成功与服务器建立连接,但是在登录过程中发生错误。
登录报错:已成功与服务器建立连接,但是在登录过程中发生错误. (provider: 共享内存提供程序, error: 0 - 管道的另一端上无任何进程. 解决办法:先用windows模式登录上去,然后 ...
- 已成功与服务器建立连接,但是在登录过程中发生错误。(provider:TCP提供程序,error:0-指定的网络名不再可用。)(Microsoft SQL Server,错误:64)
问题的发生:今天处于公网的测试服务器数据库SQL SERVER 2008 在连接时突然报错: 已成功与服务器建立连接,但是在登录过程中发生错误.(provider:TCP提供程序,error:0-指定 ...
- 转转登录一直显示服务器错误,[转]已成功与服务器建立连接但是在登录过程中发生错误。provid...
已 成功 与 服务器 建立 连接 但是 在 登录 过程 中 发生 错误 . provider 共享 内存 提供 程序 error 0 管道 的另一端上无 任何 进程 . 分类: sql server ...
- 已成功与服务器建立连接,但是在登录过程中发生错误。 (provider: SSL Provider, error: 0 - 接收到的消息异常,或格式不正确。)
已成功与服务器建立连接,但是在登录过程中发生错误. (provider: SSL Provider, error: 0 - 接收到的消息异常,或格式不正确.) 参考文章: (1)已成功与服务器建立连接 ...
- SQL SEVER登录失败,无法连接服务器或已成功与服务器建立连接,但是在登录过程中发生错误。(Win10版本,SQL 2019)
一.首先无法登陆到服务器可以检查一下操作是否打开 1.点进服务器属性 2.然后点进安全性,看下服务器身份验证是SQL SEVER 和Windows身份验证模式,,以及登录审核是否是仅限失败的登录 二. ...
- SQL Server(解决问题)已成功与服务器建立连接,但是在登录过程中发生错误
SQL Server(解决问题)已成功与服务器建立连接,但是在登录过程中发生错误 SQL Server(解决问题)已成功与服务器建立连接,但是在登录过程中发生错误.provider: Shared M ...
- 从输入 URL 到浏览器接收的过程中发生了什么事情
从输入 URL 到浏览器接收的过程中发生了什么事情? 原文:http://www.codeceo.com/article/url-cpu-broswer.html 从触屏到 CPU 首先是「输入 U ...
最新文章
- pandas 排序 给excel_懂Excel轻松入门Python数据分析包pandas(二十五):循环序列分组...
- linux下配置多网卡或多IP的方法
- C语言再学习 -- Stack Overflow(堆栈溢出)
- Qt工作笔记-QCustomplot绘制表,实现输入定位功能
- shop--7.店铺信息编辑--Controller层
- signature=c9e077ef93038bf703dbc146dd834bb7,基于RSASignUtil非对称私钥进行字符串加签及公钥解密验证的完整代码示例...
- Ubuntu查看文件夹下文件的个数
- 趣拼图最后完成及总结
- 交互式多模型_26亿参数,智源、清华开源中文大规模预训练模型
- 【题解】Luogu P2147 [SDOI2008]洞穴勘测
- CentOS 6.0 下 VNC 配置方法
- Springboot
- ARP表项的创建与更新
- 网站开发的需求分析报告
- 导航网站完整程序源码
- LJX的校园:体育课
- Linux 必学的几个命令
- 【积水成渊-逐步定制自己的Emacs神器】4:Emacs自动补全
- 003-photoshop快速去掉图片背景颜色、签名放到指定文档合成图片
- 小米手机访问电脑共享文件_小米手机不用数据线直接访问电脑上的文件的方法...
热门文章
- PAM 安全框架导致ssh无法登陆的排查方法
- “软苹果”不是孬种,只是做回了自己
- Java基础(二)——IDEA快捷键、类和对象、三大特征、构造方法、对象比较、抽象类、接口、模拟发红包
- 【蓝桥杯集训·每日一题】AcWing1394. 完美牛棚
- 手机浏览器User-Agent信息
- linux 修改磁盘挂载点,Ubuntu 添加硬盘和修改USR 到新硬盘挂载点
- camera资料链接整理
- 【嵌入式操作系统】FreeRTOS信号量mutex和semaphore的区别
- 词嵌入及方法one-hot、词袋、TFIDF
- 上海城建职业学院计算机应用技术交流群,上海城建职业学院学生转专业资格初审通过情况汇总表.PDF...