解决:Unity : Error while downloading Asset Bundle: Couldn‘t move cache data 问题
目录
问题:
尝试
问题得到解决
我的解释
问题:
最近游戏要上线,发现一个现象,部分机型在启动的时候闪退或者黑屏,概率是5%左右,通过Bugly只有个别机型才有这个现象,其实真实情况比这严重的多,bugly有时候并不能捕捉到这种情况,我们各种怀疑和查找,最终发现问题的根源。
问题日志如下:
2-18 15:04:10.924 28696 30223 E Unity : Unable to open archive file for writing: '/storage/emulated/0/Android/data/com.xfp.hnsz.ks.xwdxy.cs/files/UnityCache/Temp/0b2da51ac602117b08efce711b40391f/__data'
12-18 15:04:10.924 28696 30144 E Unity : Error while downloading Asset Bundle: Failed to decompress data for the AssetBundle 'jar:file:///data/app/~~mqBnkrTVeHx0R5PQj6Zlhw==/com.xfp.hnsz.ks.xwdxy.cs-ujHBQxE6h_IEHhAMfYKUNA==/base.apk!/assets/assets-art-atlas-achievement.spriteatlasv2_assets_all_fb282f19f9eb9a06452ff40988043469.bundle'.
12-18 15:04:10.927 28696 30148 E Unity : Unable to move cache file '/storage/emulated/0/Android/data/com.xfp.hnsz.ks.xwdxy.cs/files/UnityCache/Temp/1678b268885c708b6b23968c60116b1a' to '/storage/emulated/0/Android/data/com.xfp.hnsz.ks.xwdxy.cs/files/UnityCache/Shared/c145b22e3c49b6b6064231a90d5e684c/48c0472eecd6b114bfc238bd99e509c4': error code - 1
12-18 15:04:10.927 28696 30148 E Unity : Error while downloading Asset Bundle: Couldn't move cache data '/storage/emulated/0/Android/data/com.xfp.hnsz.ks.xwdxy.cs/files/UnityCache/Temp/1678b268885c708b6b23968c60116b1a' into place '/storage/emulated/0/Android/data/com.xfp.hnsz.ks.xwdxy.cs/files/UnityCache/Shared/c145b22e3c49b6b6064231a90d5e684c/48c0472eecd6b114bfc238bd99e509c4' when caching AssetBundle 'jar:file:///data/app/~~mqBnkrTVeHx0R5PQj6Zlhw==/com.xfp.hnsz.ks.xwdxy.cs-ujHBQxE6h_IEHhAMfYKUNA==/base.apk!/assets/icon_fr_eye.png_48c0472eecd6b114bfc238bd99e509c4.bundle'.
12-18 15:04:10.927 28696 30149 E Unity : Unable to move cache file '/storage/emulated/0/Android/data/com.xfp.hnsz.ks.xwdxy.cs/files/UnityCache/Temp/eda9c7b7cbb31ddf2be58ac700e478d6' to '/storage/emulated/0/Android/data/com.xfp.hnsz.ks.xwdxy.cs/files/UnityCache/Shared/c64d4e8d8e84733e1a9638e93f484830/1627a372980ad47ae64c100b39449f60': error code - 1
12-18 15:04:10.927 28696 30149 E Unity : Error while downloading Asset Bundle: Couldn't move cache data '/storage/emulated/0/Android/data/com.xfp.hnsz.ks.xwdxy.cs/files/UnityCache/Temp/eda9c7b7cbb31ddf2be58ac700e478d6' into place '/storage/emulated/0/Android/data/com.xfp.hnsz.ks.xwdxy.cs/files/UnityCache/Shared/c64d4e8d8e84733e1a9638e93f484830/1627a372980ad47ae64c100b39449f60' when caching AssetBundle 'jar:file:///data/app/~~mqBnkrTVeHx0R5PQj6Zlhw==/com.xfp.hnsz.ks.xwdxy.cs-ujHBQxE6h_IEHhAMfYKUNA==/base.apk!/assets/icon_mca_up.png_1627a372980ad47ae64c100b39449f60.bundle'.
12-18 15:04:11.222 28696 30025 E Unity : UnityWebRequestException: Data Processing Error, see Download Handler error
12-18 15:04:11.222 28696 30025 E Unity : at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x00000] in <00000000000000000000000000000000>:0
12-18 15:04:11.222 28696 30025 E Unity : at Cysharp.Threading.Tasks.UnityAsyncExtensions+UnityWebRequestAsyncOperationConfiguredSource.GetResult (System.Int16 token) [0x00000] in <00000000000000000000000000000000>:0
通过日志我们发现,在unityActivity一启动的时候,我们就启动下载更新文件(也就是在awake函数中调用UnityWebRequest函数将StreamingAssets的初始包的assetbundle拷贝到可写的沙盒目录下),小概率爆出如上问题。
尝试
我们怀疑是unity的storage的存储权限问题,所以我们将安装目录放到 external(SDCard)扩展卡中,默认情况是internal(沙盒目录):
并在导出android工程的清单文件(AndroidManifest.xml)下开扩展卡权限:
READ_EXTERNAL_STORAGE(读取外部存储器 )
WRITE_EXTERNAL_STORAGE(写外部存储器
但是由于发行方说,游戏已启动就申请扩展卡的存储权限,不合规;也不利于用户安装和导量的转化,最终我们将该办法摒弃掉了。
问题得到解决
从头再来,最终我们在官网发现Caching.ready
using System.Collections;
using UnityEngine;
using UnityEngine.Networking;public class Example : MonoBehaviour
{IEnumerator IsCachingReadyExample(string uri){//Using this conditional says we want to wait for our Caching system to be ready before trying to download bundleswhile (!Caching.ready){yield return null;}//Download the bundleUnityWebRequest request = UnityWebRequest.GetAssetBundle(uri);yield return request.SendWebRequest();AssetBundle bundle = DownloadHandlerAssetBundle.GetContent(request);//Do something with the AssetBundle...}
}
当我们在UnityWebRequest我们的assetbundle之前加上Caching.ready这句的时候,最终问题得到解决。
其实日志已经告诉我们,在写文件的时候无法将文件写入到缓存中。由于unity对于cache的机制以及什么时候cache.ready准备好了并没有写的很清楚(或许官方写了,我并没有找到出处)
我的解释
对于cache,unity应该unityActivity一启动的时候需要申请cache,但一定是异步或者在awake之后,而我们的下载更新就在awake第一行就启动下载并是异步的操纵,这时cache有一定概率并没有初始化完成。所有造成有一定概率爆出以上错误的原因。
如果小伙伴找到cache的详细文档以及cache.ready=true的时机,请告知我,不胜感激!!!
相关文章:

解决:Unity : Error while downloading Asset Bundle: Couldn‘t move cache data 问题
目录 问题: 尝试 问题得到解决 我的解释 问题: 最近游戏要上线,发现一个现象,部分机型在启动的时候闪退或者黑屏,概率是5%左右,通过Bugly只有个别机型才有这个现象,其实真实情况比这严重的多…...

SpringBoot默认配置文件
✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: 循序渐进学SpringBoot ✨特色专栏: MySQL学习 🥭本文内容:SpringBoot默认配置文件 📚个人知识库: Leo知识库,欢迎大家访问 1.前言☕…...

Flink构造宽表实时入库案例介绍
1. 安装包准备 Flink 1.15.4 安装包 Flink cdc的mysql连接器 Flink sql的sdb连接器 MySQL驱动 SDB驱动 Flink jdbc的mysql连接器 2. 入库流程图 3. Flink安装部署 上传Flink压缩包到服务器,并解压 tar -zxvf flink-1.14.5-bin-scala_2.11.tgz -C /opt/ 复…...
【Kubernetes】K8s 查看 Pod 的状态
K8s 查看 Pod 的状态 [rootk8s-master1 ~]# kubectl get pods NAME READY STATUS RESTARTS AGE nginx-3 1/1 Running 2 (34m ago) 14hNAME:Pod 的名称。READY:代表 Pod 里面有几个容器,前面是启动的,后面…...

Linux系统操作命令
Linux管理 在线查询Linux命令: https://www.runoob.com/linux/linux-install.htmlhttps://www.linuxcool.com/https://man.linuxde.net/ 1.Linux系统目录结构 Linux系统的目录结构是一个树状结构,每一个文件或目录都从根目录开始,并且根目…...

大模型学习与实践笔记(五)
一、环境配置 1. huggingface 镜像下载 sentence-transformers 开源词向量模型 import os# 设置环境变量 os.environ[HF_ENDPOINT] https://hf-mirror.com# 下载模型 os.system(huggingface-cli download --resume-download sentence-transformers/paraphrase-multilingual-…...

100个GEO基因表达芯片或转录组数据处理之GSE126848(003)
写在前边 虽然现在是高通量测序的时代,但是GEO、ArrayExpress等数据库储存并公开大量的基因表达芯片数据,还是会有大量的需求去处理芯片数据,并且建模或验证自己所研究基因的表达情况,芯片数据的处理也可能是大部分刚学生信的道友…...
1. Presto基础
该笔记来源于网络,仅用于搜索学习,不保证所有内容正确。文章目录 一、presto基础操作二、时间函数0、当前日期/当前时间1、转时间戳1)字符串转时间戳 (推荐)2)按照format指定的格式,将字符串str…...

ChatGPT可以帮你做什么?
学习 利用ChatGPT学习有很多,比如:语言学习、编程学习、论文学习拆解、推荐学习资源等,使用方法大同小异,这里以语言学习为例。 在开始前先给GPT充分的信息:(举例) 【角色】充当一名有丰富经验…...

20240111在ubuntu20.04.6下解压缩RAR格式的压缩包
20240111在ubuntu20.04.6下解压缩RAR格式的压缩包 2024/1/11 18:25 百度搜搜:ubuntu rar文件怎么解压 rootrootrootroot-X99-Turbo:~/temp$ ll total 2916 drwx------ 3 rootroot rootroot 4096 1月 11 18:28 ./ drwxr-xr-x 25 rootroot rootroot 4096 1月…...

YOLOv5改进 | 检测头篇 | ASFFHead自适应空间特征融合检测头(全网首发)
一、本文介绍 本文给大家带来的改进机制是利用ASFF改进YOLOv5的检测头形成新的检测头Detect_ASFF,其主要创新是引入了一种自适应的空间特征融合方式,有效地过滤掉冲突信息,从而增强了尺度不变性。经过我的实验验证,修改后的检测头在所有的检测目标上均有大幅度的涨点效果,…...
第十三章 接口测试(笔记)
一、接口测试分类 内部接口:测试被测系统各个子模块之间的接口,或者被测系统提供给内部系统使用的接口 外部接口: 1.被测系统调用外部的接口 2.系统对外提供的接口 接口测试重点:检查接口参数传递的正确性,接口功能的正确性,输出结果的正确性,以及对各种异常情况的容错…...

Github搭建图床 github搭建静态资源库 免费CDN加速 github搭建图床使用 jsdelivr CDN免费加速访问
Github搭建图床 github搭建静态资源库 免费CDN加速 github搭建图床使用 jsdelivr CDN免费加速访问 前言1、创建仓库2、开启 gh-pages页面功能3、访问测试 前言 写博客文章时,图片的上传和存放是一个问题,使用小众第三方图床,怕不稳定和倒闭&…...
Airtest-Selenium实操小课②:刷B站视频
1. 前言 上一课我们讲到用Airtest-Selenium爬取网站上我们需要的信息数据,还没看的同学可以戳这里看看~ 那么今天的推文,我们就来说说看,怎么实现看b站、刷b站的日常操作,包括点击暂停,发弹幕,点赞&#…...

Linux chmod命令详解
Linux chmod(英文全拼:change mode)命令是控制用户对文件的权限的命令 Linux/Unix 的文件调用权限分为三级 : 文件所有者(Owner)、用户组(Group)、其它用户(Other Users)…...

求幸存数之和 - 华为OD统一考试
OD统一考试(C卷) 分值: 100分 题解: Java / Python / C++ 题目描述 给一个正整数列nums,一个跳数jump,及幸存数量left。运算过程为:从索引为0的位置开始向后跳,中间跳过 J 个数字,命中索引为 J+1 的数字,该数被敲出,并从该点起跳,以此类推,直到幸存left个数为止。…...

【QML COOK】- 008-自定义属性
前面介绍了用C定义QML类型,通常在使用Qt Quick开发项目时,C定义后端数据类型,前端则完全使用QML实现。而QML类型或Qt Quick中的类型时不免需要为对象增加一些属性,本篇就来介绍如何自定义属性。 1. 创建项目,并编辑Ma…...

前端页面优化做的工作
1.分析模块占用空间 new (require(webpack-bundle-analyzer).BundleAnalyzerPlugin)() 2.使用谷歌浏览器中的layers,看下有没有影响性能的模块,或者应该销毁没销毁的 3.由于我们页面中含有很大的序列帧动画,所以会导致页面性能低࿰…...

Spark六:Spark 底层执行原理SparkContext、DAG、TaskScheduler
Spark底层执行原理 学习Spark运行流程 学习链接:https://mp.weixin.qq.com/s/caCk3mM5iXy0FaXCLkDwYQ 一、Spark运行流程 流程: SparkContext向管理器注册并向资源管理器申请运行Executor资源管理器分配Executor,然后资源管理器启动Execut…...
关于鸿蒙的笔记整理
提示:有使用过 vue 或 react 的小伙伴更容易理解 知识点强调: ArkTS所有内容都不支持深层数据更新 UI渲染 文章目录 一、关于样式1 . 默认单位 vp2 . 写公共样式 二 、 加载图片三 、 自定义构建函数 Builder四、构建函数-BuilderParam 传递UI五 、 父子…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...

Rust 开发环境搭建
环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu 2、Hello World fn main() { println…...