【Unity Addressables】Addressables源码移植优化(二)
继上次移植之后,对于Addressable的更新优化还是无果
最近因为新版本问题,腾出来点时间,再重新研究一下
====================================================================================
一.问题
1.发现不管更新多大的内容,每次更新他都会把所有的Key值遍历检测一边,而且这些key里面有bundle名称,也有工程资源设置的key值,也有对应的hash值等,很多目前看是无效的;
2.一部分key在获取更新大小的时候>0,在更新的时候又是=0
二.原理
1.他这个检测,其实就是获取远端最新的资源信息文件,通过对比信息文件中记录的hash值和本地缓存的文件hash值,来确定是否需要更新;
2.bundle之间可能是有依赖的,例如一个预设可能引用了好多贴图,字体等,在实际更新预设的时候,他会把所有依赖的bundle全部更新,等到更新这些依赖项的时候,他自己已经被更新过了,所有会=0;
三.优化方案
对比hash更新是没问题的,但是因为这些bundle名称,key,hash太多,导致这个更新检测列表过于庞大,可能总体更新下载量不需要多少,但是会遍历很长时间列表,表现就是更新下载巨慢(当然我这里主要是因为CDN网络问题)
先保留bundle名称试一下,keys里筛选保留了带bundle后缀的key,但是获取不到更新,失败;
再试addressable设置的key,这时候发现你无法区分哪些是设置key,通过查看源码,也没有获取到对应的key值;
于是我想着,是否可以按照原来自定义更新里面,读取一个更新列表文件,将工程里面配置Key都写在文件中
替换上面的Keys,来获取需要的更新
发现虽然还有依赖项被更新的情况,但是遍历的keys少了很多,整体的更新表现和更新用时都快了至少一倍以上;
本来就打算这样先更新了
但是这些写死的Keys,要么把所有的Key都写上 ,要么每次更新把修改过的key写上
还是有额外的遍历 或者 人为操作太麻烦
想了下应该是有别的办法能解决的
在下载更新的地方找到了
这块代码就很熟悉
下载那块代码和获取更新大小的地方不能说像,只能说一模一样
于是我在获取更新大小的地方,把所有需要更新的location保存下来,然后return
但是在源码中并没有找到对应直接下载的接口,还好是有源码,自己加
没有多少代码,只是把原来下载更新代码的一部单独拿出来
完工,这样就可以实现通过Addressable系统原版的更新检测机制获取到需要更新的资源,然后下载需要更新的资源
而且因为这些locations本身就是通过Key找出来的依赖,下载的时候只会下载自己
散花,完结
原文地址:https://www.cnblogs.com/lovewaits/p/15119240.html
- 1934: [Shoi2007]Vote 善意的投票
- 算法模板——线段树8 (字符串回文变换)
- 算法模板——哈希单模板字符串匹配
- javascript 原型及原型链详解
- 算法模板——并查集 2(支持快速即时查询本连通块内容,纯原创!)
- 1707: [Usaco2007 Nov]tanning分配防晒霜
- JavaScript 图片的上传前预览(兼容所有浏览器)
- 算法模板——sap网络最大流 3(递归+邻接表)
- BZOJ4819: [Sdoi2017]新生舞会(01分数规划)
- 3401: [Usaco2009 Mar]Look Up 仰望
- javascript 基本概念
- vue内置指令详解——小白速会
- javascript 函数详解
- 深海中的STL—nth_element
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 关于tf.matmul() 和tf.multiply() 的区别说明
- python中执行smtplib失败的处理方法
- PHP+Ajax简单get验证操作示例
- Python matplotlib读取excel数据并用for循环画多个子图subplot操作
- python转化excel数字日期为标准日期操作
- thinkPHP框架通过Redis实现增删改查操作的方法详解
- PHP中引用类型和值类型功能与用法示例
- PHP文件上传小程序 适合初学者学习!
- php的扩展写法总结
- 实例介绍PHP删除数组中的重复元素
- Python迭代器协议及for循环工作机制详解
- PHP CURL中传递cookie的方法步骤
- PHP 结合 Boostrap 结合 js 实现学生列表删除编辑及搜索功能
- Yii2处理密码加密及验证的方法
- PHP实现获取ip地址的5种方法,以及插入用户登录日志操作示例