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

Unity3d热更新全书-加载(一)从AssetBundle说起

Unity3D动态下载资源,有没有解?有,AssetBundle就是通用解,任何一本书都会花大幅篇章来介绍AssetBundle.

我们也来说说AssetBundle

我们试全面的分析一下Unity3D提供的资源加载机制

1.Resources//内嵌资源,使用方法Resources.Load,可以加载任意种类的资源,不能动态修改,卒。

2.StreamingAssets//随包资源,使用方法IO或WWW.Load。WWW.Load可以加载任意种类资源,IO仅限bytes 和 text。

3.WWW 从网络下载并加载

4.WWW 从网络加载AssetBundle

一和二显然不具有热更新的效果,这里就不做讨论。

3 4都是从网络加载,他们有什么区别呢。

首先说3,这是没有缓存的,我们显然不想让用户重复的浪费流量,不可取。

然后是4,assetBundle提供了一个版本号来做缓存比对,可以比较好的起到更新的目标

assetBundle原来就是Unity3D为我们准备的解决方案,难怪每本书都会大篇介绍AssetBundle,后文简称AB。

每本书都告诉你,AB很强大,AB帮你解决了跨平台问题,帮你解决了依赖关系。

而这个系列,不打算只讲别人讲的东西,我们要告诉你一些小秘密。

AssetBundle是天使还是恶魔

首先AB的确很好很强大,他能收纳Unity自己的所有资源种类,贴图、材质、shader、预设。

然后可以每平台支持,这就是第一个陷阱,注意是每平台支持,不是多平台支持。

每个平台要单独导出,而每个平台到底差了些什么呢?答案是,nothing。

那么为什么每个平台要单独导出呢?因为Unity考虑到每个平台的质量关系,进行了质量相关的差异化。

而最大的质量差异,源自贴图。

有些平台贴图不压缩,有些平台贴图要压缩,而且根据不同的平台特性,套用不同的压缩算法,先压过再存到包里。

这就是AB帮你干的最主要的事情。

听起来很贴心呢,等等,你是不是忘了一个特定的命题,这个命题叫做UI。

压缩的图片会有质量损失,UI贴图我们通常是不压缩的。

然后UI还会触及到AB的另一个问题

以NGUI为例,NGUI的资源关系比较复杂,有贴图-》图集-》布局

不同布局经常交叉引用贴图

如果用AB想把每个界面分开打包,给用户最小的资源更新量,这个任务可以用灾难来形容。

最终热更新推送给用户的东西是以文件为单位的,而AB在小粒度文件并且之间有较为复杂的引用关系这种需求下的使用是一场灾难。

AB对每个平台的差异编译不是可选的,而是强制的,假如你有web、ios、android三个平台,无论如何你都要导出三次。

没了AssetBundle,我们怎么办

把碎片文件下载回来,并且组装

对于UI这个情境,是完全可行的。把布局和图集保存为文本形式,把文本和贴图下载回来,然后组装。

对于其他的场景片段,在有动画和贴图需要压缩的情况下,AB依然是唯一选择。

unity没有提供在运行时压缩贴图的手段,动画也不容易存取,只能在运行时压缩DXT,只有pc和wp8支持。

对于各种各样的资源加载会特别的凌乱么?不会。

其实本质上可以统一成Bytes的处理

Texture可以从Bytes加载

字符串 可以从Bytes加载

AB可以从Bytes加载

自定义二进制存储,嘛本身就是bytes

所以只要我们的下载系统提供下载bytes并缓存,之后所有的资源加载都从Bytes进行,就可以统一起来。

下载部分我们在另一个专题介绍。

下一篇介绍将UI布局保存到文件与恢复。

相关文章:

  • JVM -XX: 参数介绍
  • 代码的坏味道之五 ——译自《重构》
  • 【转载】跨语言通信方案比较
  • 【WP 8.1开发】自定义(RAW)通知的使用
  • java 递归函数
  • jQuery Validation Engine 表单验证
  • GLES Shader Language 易错集锦
  • python的getopt
  • mac下mysql忘记root密码
  • 编程语言,变量
  • 关于git和github用法
  • Python学习(一)——数据类型
  • 定制微型Linux系统(续)
  • Redis进阶 ----事务
  • 【Spark亚太研究院-构建Spark集群-配置Hadoop伪分布模式并运行Wordcount(2)
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • axios 和 cookie 的那些事
  • java 多线程基础, 我觉得还是有必要看看的
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • Java新版本的开发已正式进入轨道,版本号18.3
  • js数组之filter
  • Meteor的表单提交:Form
  • MYSQL 的 IF 函数
  • orm2 中文文档 3.1 模型属性
  • Redis在Web项目中的应用与实践
  • vue2.0项目引入element-ui
  • vuex 学习笔记 01
  • Webpack入门之遇到的那些坑,系列示例Demo
  • Zepto.js源码学习之二
  • 百度小程序遇到的问题
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 你不可错过的前端面试题(一)
  • 前端存储 - localStorage
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 十年未变!安全,谁之责?(下)
  • 转载:[译] 内容加速黑科技趣谈
  • Nginx实现动静分离
  • #{} 和 ${}区别
  • #include<初见C语言之指针(5)>
  • #pragma once
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • ()、[]、{}、(())、[[]]命令替换
  • (1)bark-ml
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • *上位机的定义
  • ./configure,make,make install的作用(转)
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .net core控制台应用程序初识
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)