Unity5的AssetBundle修改比较大,所以第一条建议是:忘掉以前的用法,重新来!要知道,Unity5已经没办法加载2.x 3.x的bundle包了…
体会一下Unity5 AssetBundle的优势:
  Cube引用Material,给Cube和Material设置不同的assetBundleName,分开打包,两个包各自只包含自己,各自独立。如需修改Material,只需要重打包Material即可。
  对于4.x版本,要么Cube包中会包含这个Material,导致需要重打整个Cube,要么需手动关联Cube和Material的引用关系,在代码中手动赋值。
  那么改进之处就是:不需要我们来管理引用关系了,不需要我们来管理引用关系了,不需要我们来管理引用关系了!可以分开打包而不需要额外的关联代码,对于公用资源,只需要将公用资源分开打包即可。
  测试案例:Cube1和Cube2同时引用texture,shader使用自带的Standard

打包方式

结果

分析

Cube1、Cube2分别打包

Cube1.assetbundle
53k

Cube2.assetbundle
53k

texture重复打包

Cube1、Cube2分别打包

texture单独打包

Cube1.assetbundle
9k

Cube2.assetbundle
9k

Texture.assetbundle
48k

texture只有一份,而且不需要代码手动给Cube1设置使用texture,

资源撕开了,引用还在,Cool~

一、资源打包
  (1)给要打包的资源设置标记,表示对应的包名:

  

  可以使用代码批量设置包名(只支持小写),大致如下:

  1. AssetImporter ai = AssetImporter.GetAtPath(assetPath);
  2. i.assetBundleName = xxx;
  3. ai.assetBundleVariant = xxx;

  (2)生成assetbundle资源包,打包函数简化,主要参数只需要一个输出地址:

  1. AssetBundleManifest BuildAssetBundles(string outputPath, BuildAssetBundleOptions assetBundleOptions, BuildTarget targetPlatform);

  调用该函数,unity会自动根据资源的标签进行打包,而且是增量打包
  a.对于资源没有变更的bundle包,不会触发重新打包;
  b.资源没变,即使生成目录下的bundle包被删除了,unity也不会重新打包;
  c.生成目录下的bundle包对应的manifase被删了,会重新打包;
  d.可以使用BuildAssetBundleOptions.ForceRebuildAssetBundle参数触发强制重新打包。
  另外,unity提供了另一个版本的打包函数:

  1. AssetBundleManifest BuildAssetBundles(string outputPath, AssetBundleBuild[] builds, BuildAssetBundleOptions assetBundleOptions, BuildTarget targetPlatform);

  该函数提供了不依赖资源标签、通过代纯代码的方式打包生成资源的能力。
  (3)生成的bundle包资源目录解析
  下图是针对Cube.prefab生成的资源目录结构:

  

  StreamingAssets:一个AssetBundle包,内含AssetBundleManifest类型的Asset,记录了所有bundle包及相互间的依赖关系。
    运行时需要首先加载这个AssetBundleManifest,然后根据其提供的depence信息加载依赖的bundle包。
  StreamingAssets.manifest:全局manifest,全局manifest的名字和打包生成的目录同名,不是固定的,这里是生成在StreamingAssets目录下。
  Cube.assetbundle:资源bundle。
  Cube.assetbundle.manifest:每个资源自己的manifest,与bundle一一对应,只是用来做增量build,运行时根本不需要。

二、压缩格式
  (1)LZMA:默认压缩格式,压缩比大,省空间,使用前需要解压整个压缩包;
  (2)LZ4:5.3版本新增, 40%–60% 的压缩率,开启BuildAssetBundleOptions.ChunkBasedCompression打包参数即可。
    LZ4算法是“基于块”的,因此当对象从一个LZ4压缩包加载时,仅用于该对象的相应块会被解压,不需要解压整个包。
    所以LZ4和不压缩资源一样,都可以不解压,而直接读取包中的资源的。
  (3)UnCompress:不压缩,访问最快,费空间。
  一组测试数据:

LZMA:1.45M

LZ4:2M

UnCompress:4M

  LZ4格式压缩比还可以,而且加载速度也很快,是大多数情况下的最优解。

三、AssetBundle加载方式对比
  主要的加载方式有以下四种,前两种还兼具下载的功能,后两种都有对应的异步接口:
  (1)WWW:只走内存,内存解压、不缓存;
  (2)LoadFromCacheOrDownload:走本地cache,没有就下载并解压(然后再LZ4压缩),有就用;
    如果没有缓存,对于未压缩的和LZ4压缩的AssetBundle包,unity会直接把它们拷贝到缓存目录里面,对于LZMA压缩的,会先解压然后重新压缩成LZ4格式,然后缓存它。可以通过Caching.compressionEnabled控制是否压缩缓存。
  (3)LoadFromFile:最快的方式,区别于4.x版本,可以直接使用压缩资源;
    如果是UnCompress或LZ4,直接从disk读取
    如果是LZMA,会先解压到memory,然后读取
  (4)LoadFromMemory:从内存加载,一般用于加密资源。
  使用方式建议:
  (1)随包资源StreamingAssets:
    未压缩或LZ4压缩:LoadFromFile;
    LZMA压缩:可使用 WWW.LoadFromCacheOrDownload解压缩到本地磁盘。
  (2)热更新资源:LZMA+WWW.LoadFromCacheOrDownload+Caching.compressionEnabled;
  (3)加密资源:LZ4+LoadFromMemory;
  (4)自己压缩的资源:UncompressAssetBundle的AssetBundle包+自己的算法压缩+LoadFromFileAsync。

四、资源卸载
  AssetBundle.Unload(false):干掉压缩包,bundle不再可用,即不能再通过bundle.Load加载资源;
  AssetBundle.Unload(true):干掉压缩包,和所有从中加载(load)出来的资源。
  所以卸载资源一般有两种玩法:
  (1)AssetBundle.Unload(false)结合Resource.UnloadUnusedAssets()
  (2)碎片化使用AssetBundle.Unload(true)
  具体怎么用要结合游戏本身的数据特点来定制。关于要不要Unload释放AssetBundle本身的内存,也有两种主流玩法,一种是即用即卸(LoadAsset以后立马释放AssetBundle),一种是缓存AssetBundle不卸载,两种方法各有优劣,需结合使用。

五、项目建议
  (1)对于bundle中的shader,需要避免重复打包:
  场景:Cube1使用自带的shader Standard

打包方式

结果

分析

Cube1单独打包,shader不进包

Cube1.assetbundle
9k

Cube1单独打包,shader进包

Cube1.assetbundle
118k

可以看到Standard这个shader编译后也是相当大的

  对于shader一定要注意重复打包,要么将使用的shader配置在Always Included
Shaders,要么将shader也单独打包(这种方案还没试过)

  

  (2)内存分析:
  一个AssetBundle压缩包并不大,所以同时缓存100个不释放也没多大(4.x这个东西还是很大的,不能缓存太多)。
  AssetBundle创建,会在Not Saved/AssetBundle分组下多出一个bundle,大小4.1k:

  

  LoadAsset(cube1)后,会在Assets下多处cube1产生的asset:

  

  经测试,AssetBundle所占用的相关内存,只要管理好引用,是可以完全回收的。
  (3)资源LOD
  一个资源可以设置两个标签,第一个参数assetBundleName 表示包的名字,第二个参数assetBundleVariant 用来做资源的LOD。
  假设本地有两套贴图资源,一套高清,一套普通,然后给他们设置同样的assetBundleName为MyAsset,高清资源的assetBundleVariant 设置为LD,普通资源设置为SD,那么就可以根据不同设备通过选择加载MyAsset.LD或MyAsset.SD来切换资源库,这样依赖MyAsset的Prefab就可以动态切换版本了。
  注意,两套资源集的asset必须完全一一对应,对于unity来说LD和SD是同一个bundld,同一时刻只能加载其中一个。
  (4)由于打包极大地简化了,没有指定mainAsset的过程,所以AssetBundle.mainAsset已经不能用了,很忧桑。
  (5)WWW.LoadFromCacheOrDownload一帧只会有一个bundle完成下载
    AssetBundle bundle = www.assetBundle;
    访问www.assetBundle属性就是同步从www中抽取并创建AssetBundle

  上述排版有点乱,点击此处直接查看排版好的图片格式

Unity5 AssetBundle系列——基本流程的更多相关文章

  1. Unity5 AssetBundle系列——简单的AssetBundleManager

    一个AssetBundle同时只能加载一次,所以实际使用中一般会伴随着AssetBundle包的管理. 下面是一个简单的AssetBundle管理器,提供了同步和异步加载函数: using Unity ...

  2. Unity5 AssetBundle系列——资源加载卸载以及AssetBundleManifest的使用

    下面代码列出了对于assetbundle资源的常用操作,其中有针对bundle.asset.gameobject三种类型对象的操作,实际使用中尽量保证成对使用. 这一块的操作比较繁琐,但只要使用正确, ...

  3. AssetBundle系列——场景资源之解包(二)

    本篇接着上一篇继续和大家分享场景资源这一主题,主要包括两个方面: (1)加载场景 场景异步加载的代码比较简单,如下所示: private IEnumerator LoadLevelCoroutine( ...

  4. 【Unity3D技术文档翻译】第1.9篇 使用 Unity AssetBundle Browser tool (AssetBundle系列完结)

    上一章:[Unity3D技术文档翻译]第1.8篇 AssetBundles 问题及解决方法 本章原文所在章节:[Unity Manual]→[Working in Unity]→[Advanced D ...

  5. Unity5 AssetBundle资源管理架构设计

    http://blog.csdn.net/qq_19399235/article/details/51702964 1:Unity5 资源管理架构设计(2017.4.22版本) 2:Android 热 ...

  6. Sql Server系列:流程控制语句

    T-SQL中用来编写流程控制模块的语句有:BEGIN...AND语句.IF...ELSE语句.CASE语句.WHILE语句.GOTO语句.BREAK语句.WAITFOR语句和RETURN语句. 1 B ...

  7. Unity5 AssetBundle

    设置assetBundleName AssetImporter importer = AssetImporter.GetAtPath(p); importer.assetBundleName = x; ...

  8. Unity5 AssetBundle 打包以及加载

    using UnityEngine; using System.Collections; using System.Collections.Generic; using UnityEditor; us ...

  9. AssetBundle系列——共享资源打包/依赖资源打包

    有人在之前的博客中问我有关共享资源打包的代码,其实这一块很简单,就两个函数: BuildPipeline.PushAssetDependencies():依赖资源压栈: BuildPipeline.P ...

随机推荐

  1. [洛谷P1731][NOI1999]生日蛋糕(dfs)(剪枝)

    典型的深搜+剪枝策略 我们采用可行性剪枝.上下界剪枝.优化搜索顺序剪枝.最优性剪枝的方面来帮助我们进行剪枝. 也许有人还不知道剪枝,那我就弱弱地为大家补习一下吧qwq: .优化搜索顺序: 在一些搜索问 ...

  2. SQL Server中查找包含某个文本的存储过程

    SELECT name,text from sysobjects o,syscomments s where o.id=s.id and text LIKE '%text%' and o.xtype= ...

  3. AGC 016C.+/- Rectangle(思路 构造)

    题目链接 首先想到同样例1的构造方式.即不得不填负的格子填\(-h*w\),其余填\(1\).直接这样能过二三十个点. 只这样不对.比如1 4 1 3,会输出无解(会填[1 1 -3 1]).怎么改呢 ...

  4. BZOJ.2434.[NOI2011]阿狸的打字机(AC自动机 树状数组 DFS序)

    题目链接 首先不需要存储每个字符串,可以将所有输入的字符依次存进Trie树,对于每个'P',记录该串结束的位置在哪,以及当前节点对应的是第几个串(当前串即根节点到当前节点):对于'B',只需向上跳一个 ...

  5. [清橙A1210]光棱坦克

    [清橙A1210]光棱坦克 题目大意: 平面上放置了\(n(n\le7000)\)个反射装置,光纤将从某个装置出发,在经过一处装置时发生反射,若经过的装置坐标依次为\((x_1,y_1),(x_2,y ...

  6. treap(树堆)

    一棵treap是一棵修改了结点顺序的二叉查找树,如图,显示一个例子,通常树内的每个结点x都有一个关键字值key[x],另外,还要为结点分配priority[x],它是一个独立选取的随机数. 假设所有的 ...

  7. BZOJ5384 有趣的字符串题 回文树

    神奇的结论: 一个字符串的所有回文后缀的长度,可以形成$k$个等差数列,$k$是$log$级的 考虑前$R$个字符组成的字符串,对于一个等差数列,假设组成这个等差数列的回文串,最短的叫$a$,最长的叫 ...

  8. (netty宝贵知识)

    例子:https://segmentfault.com/a/1190000013122610?utm_source=tag-newest#articleHeader0 netty官方文档http:// ...

  9. Qt开发的程序在没有安装Qt环境的机器上可能出现的一些问题

    Qt开发的程序在没有安装Qt环境的机器上可能出现的一些问题,如:除png外的其它类型的图片,如:jpg.ico.bmp等,还有中文乱码等问题,出现这些问题的本质是Qt对这类文件格式或编码格式的支持方式 ...

  10. Windows远程桌面,连接被拒绝,因为没有授权此用户帐户进行远程登录。

    Windows 服务器远程连接的时候,出现错误:“连接被拒绝,因为没有授权此用户帐户进行远程登录.”,导致无法远程登录服务器,如下图所示: 问题分析 该错误一般是由于 Windows 远程桌面相关权限 ...