当前位置: 首页 > news >正文

Unity中文件上传以及下载,获取下载文件大小的解决方案

首先现在Unity插件那么的广泛的情况下,很多东西都不需要自己实现,直接使用第三方插件就可以了,但为什么这里需要自己写,接下来说明原因。

在Unity商城中有很多关于关于网络接口调用的插件,其中有一款叫BestHTTP这款使用比较广泛的插件,不知道朋友们是不是都知道,是不是都有用过,很多功能都已经给你实现好了,你只需要调用就可以了,插件很好用是吧。

以前我也用这个插件,在很多方面的确很好用,但是在个别平台有个很严重的问题,这个插件的调用占用内存会非常高,而且有一定的内存泄露。

在PC和移动端,由于现在硬件设备配置普遍都比较高,所以可能感觉的不会很明显,但在Webgl端,也是我经历之后才在之后的项目中不再使用这款插件的原因。在Unity的Webgl,限制了最多只能使用2048m的缓存,超过这个缓存值,网页就会报异常,到现在我也不知道该怎么解决这个问题,希望有知道的朋友告知一下,谢谢。

继续说原因,在Webgl端使用这个插件会有很明显的内存被大量占用,并且有一定的内存泄露,之前有一个项目,加载场景AB包,提一嘴本身每个平台的AB大小都是不一样的,虽然没比较过所有平台的,但是Webgl的AB包会比PC和移动端的大很多。

加载100m左右场景AB包,使用该插件加载只能加载2-3次就会直接报内存溢出,也就是前面说的超过了2048m的缓存上限。

因此后续就改成用Unity自带的UnityWebRequest类了,使用自带的也会有多占用内存的现象但是比该插件就会好很多,例如加载100m左右的ab能够加载12-15次时,才有可能会出现内存溢出的问题,如果有些数据释放的及时,甚至能加载更多次。

说了一大端的原因,那么接着就进入正题,首先下载,下载有个小问题,就是我们拿不到下载文件的总大小,这里我就提供解决方案,具体的实现根据自身项目使用

解决方案:
1、如果文件保存在对象存储上的,有一个Head请求,可以拿到文件的信息,里面包含了文件大小,但是这需要对象存储开启Head请求的权限
2、后台自己写一个保存文件的总大小,下载前先调用获取文件信息
3、UnityWebRequest中提供了两个数据,一个是progress进度,一个是当前下载量,那么其实可以通过 当前下载量/progress,反推出文件大小,只不过这个方式可能存在误差,但应该误差不会很大,所以如果不想多次请求的话可以使用这种方式

1、通过Head请求获取文件信息(方法使用了异步,使用异步需要扩写异步Task.GetAwaiter(),这方面已经有现成的异步插件了,以从夸克下载地址获取(不定时会更新该插件,如果其他文章中涉及到第三方插件,也会在该地址中提供测试的插件下载):https://pan.quark.cn/s/58004b052787)

        public static async void GetDownloadFileSize(string downloadUrl, Action<WebRequetState, UnityWebRequest, ulong, string> outputAction = null, Dictionary<string, string> headers = null){using (UnityWebRequest webRequest = UnityWebRequest.Head(downloadUrl)){if (headers != null){foreach (var info in headers){webRequest.SetRequestHeader(info.Key, info.Value);}}webRequest.useHttpContinue = false;outputAction?.Invoke(WebRequetState

相关文章:

  • Ubuntu下安装vsode+qt搭建开发框架(一)
  • 智慧园区IOT项目与AI时代下的机遇 - Java架构师面试实战
  • 设计一个关键字统计程序:利用HashMap存储关键字统计信息,对用户输入的关键字进行个数统计。
  • P3309 [SDOI2014] 向量集 Solution
  • 浏览器界面无显示,提示“代理服务器可能有问题”,这是怎么回事呢?
  • Windows 安装 Neo4j 教程
  • 做大模型应用所需的一点点基础数学理论
  • 内存四区(栈)
  • Java24 抗量子加密:后量子时代的安全基石
  • 【MCP】了解远程MCP调用背后使用的SSE协议
  • 使用matplotlib绘制Raincloud图/云雨图/柱状图/小提琴图
  • 学习记录:DAY18
  • 图论---LCA(倍增法)
  • 使用 AFL++ 对 IoT 二进制文件进行模糊测试 - 第二部分
  • Spring Boot 3.4.5 运行环境需求
  • 精益数据分析(26/126):依据商业模式确定关键指标
  • Nginx性能优化:从配置到缓存,全面提升Web服务器性能
  • 重定向和语言级缓冲区【Linux操作系统】
  • RT-Thread学习笔记(四)
  • 【Android】四大组件之Service
  • “冲刺万亿城市”首季表现如何?温州领跑,大连GDP超徐州
  • 审议民营经济促进法草案等,十四届全国人大常委会第十五次会议将举行
  • 机票搜索热度飙升,透过数据看五一假期旅游热度
  • 生于1984年,马玥已任辽宁锦州北镇市代市长
  • 小马智行彭军:今年是Robotaxi量产元年,有望3年后盈亏平衡
  • 中美正在就关税问题谈判甚至会达成协议?外交部:都是假消息