Asunaの楠世 2024-07-25 18:31 采纳率: 0%
浏览 29
已结题

unity追加写入idbfs系统导致报错,如何解决?


using System.IO;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;

//Encoding:UTF-8
public class NewBehaviourScript : MonoBehaviour
{
    //128492555
    string url = "http://xxx.xxx.com:5678/xxx_resume_99/StreamingAssets/aa/WebGL/xxxx.bundle";
    int start = 0;
    int size = 104857600;
    int bundleSize = 128492555;

    private void Start()
    {
        StartCoroutine(aa());
    }

    IEnumerator aa()
    {
        string path = Path.Combine(Application.persistentDataPath, "ABCache", "xxxx.bundle");
        Debug.Log("---------1--------" + path);
        UnityWebRequest webRequest = UnityWebRequest.Get(url);
        webRequest.downloadHandler = new DownloadHandlerFile(path, true);
        Debug.Log("---------2--------" + start + "---------" + (start + size - 1).ToString());
        string end = start + size - 1 >= bundleSize ? "" : (start + size - 1).ToString();
        webRequest.SetRequestHeader("Range", "bytes=" + start + "-" + end);
        yield return webRequest.SendWebRequest();
        if (string.IsNullOrEmpty(webRequest.error))
        {
            Debug.Log("---------3--------" + new FileInfo(path).Length);
            if (start + size < bundleSize)
            {
                start += size;
                StartCoroutine(aa());
            }
        }
        else
        {
            Debug.LogError(webRequest.error);
        }
    }
}

  1. 分段缓存一个资源,每10M下载就会在112m左右的那一段报错,报错信息是空的,每100M下载就在第二段报错(一共122M),但是一次性下载就不会报错,这是我从正在做的项目中遇到问题写的测试,正式项目还会下载一个三百多k的小文件,我尝试每1k下载一段,这个小文件是不会追加写入出错,但是这个122m的大文件就会在最后出错
  2. 我也尝试用FileStream写入会发生同样的问题,只要是分段追加写入就会出错,合并之后一次性写入就不会,但是webgl项目要控制内存的使用,不能合并再写入,通过打印确认过了不是下载的问题,就是在FileStream.Wirte()时候出现的问题,所以不用再往UnityWebRequest相关方向回答了

---------------------最新更新---------------------

  1. 已经发现是unity的Emscripten版本过低的问题了,导致了写入idbfs系统时报错,目前我使用的是2020.3.18,升级到2021.2及以上版本就会解决,官网详细信息
  2. 毕竟是大项目升级unity跨度这么大的版本难度还是不小,现在准备通过js调用新版Emscripten来解决这个问题,目前还在研究
  3. 希望回答按照这个方向回答吧,大家们回答的有点偏,gpt我都问烂了,有用我早解决了

这个问题困扰我三个礼拜了,哪位可以帮我解决一下

img

---------------------结题--------------------
回答没有什么回答到点子上的,目前研究的进度是使用了最新官网下载的Emscripten构建了一个最新的fs文件管理系统文件,通过使用jslib引入调用操作自己构建的新的文件系统,现在已经可以追加写入的自定义的idbfs系统了,并且可以正常获取路径是否存在和资源大小,还未攻克的是资源在C#中加载,等完全跑通整个系统我写个文章发出来

  • 写回答

27条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-07-25 18:31
    关注

    引自免费微信小程序:皆我百晓生

    你的问题是在使用UnityWebRequest进行分段下载资源时,出现报错,尤其是当分段大小接近或超过整体资源大小时。这个问题可能涉及到服务器端的支持、UnityWebRequest的使用方式以及可能的资源损坏等问题。以下是一些可能的解决方案和建议:

    1. 检查服务器端支持:首先,确认服务器是否支持Range请求头进行分段下载。有些服务器可能不支持或不正确实现Range请求,导致分段下载失败。你可以尝试直接在浏览器中测试相同的URL和Range请求头,看是否可以正常下载。
    2. UnityWebRequest的使用方式:确保你的UnityWebRequest设置正确。特别是关于Range请求头的设置,确保起始和结束字节范围正确。你可以尝试简化代码,例如先进行一次完整的下载来确认资源大小,然后根据资源大小来设置分段下载的Range。
    3. 资源损坏或不一致:由于你提到一次性下载不会报错,分段下载时才会报错,这可能是因为某些分段下载过程中资源被损坏或不一致。尝试重新上传或检查服务器上的资源文件,确保完整性。
    4. 调试和日志:增加更多的日志输出,特别是在设置和解析Range请求头时,以便更好地了解问题的根源。此外,查看Unity的详细错误日志或服务器的响应日志,可能会提供更多关于错误的线索。
    5. 分段大小:考虑调整分段下载的大小。如果分段大小设置不合理,可能会导致某些特定大小的段出现问题。尝试调整分段大小,看是否可以解决问题。
    6. Unity版本和插件:确认你使用的Unity版本和UnityWebRequest插件是否兼容。有时候,更新Unity或插件版本可能会解决一些问题。

    由于没有具体的代码和服务器端的详细信息,很难确定问题的确切原因。建议你根据上述建议逐一排查问题,并尝试简化代码和增加调试信息以找到问题的根源。如果问题仍然存在,你可以提供更多的信息,如详细的错误日志、服务器端的响应等,以便进一步分析和解决问题。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 8月1日
  • 修改了问题 8月1日
  • 修改了问题 7月29日
  • 修改了问题 7月26日
  • 展开全部

悬赏问题

  • ¥200 csgo2的viewmatrix值是否还有别的获取方式
  • ¥15 Stable Diffusion,用Ebsynth utility在视频选帧图重绘,第一步报错,蒙版和帧图没法生成,怎么处理啊
  • ¥15 请把下列每一行代码完整地读懂并注释出来
  • ¥15 pycharm运行main文件,显示没有conda环境
  • ¥15 易优eyoucms关于二级栏目调用的问题
  • ¥15 寻找公式识别开发,自动识别整页文档、图像公式的软件
  • ¥15 为什么eclipse不能再下载了?
  • ¥15 编辑cmake lists 明明写了project项目名,但是还是报错怎么回事
  • ¥15 关于#计算机视觉#的问题:求一份高质量桥梁多病害数据集
  • ¥15 特定网页无法访问,已排除网页问题