资源对于手游来说其重要性是不言而喻的,bundle的打包策略最终影响的是资源的加载以及内存,所以要根据项目的实际情况去平衡你的bundle的粒度和大小。对于粒度,因为项目起初用的是Unity5.3.8的版本,官方工程师的说法是每个Assetbundle文件在Load的时候都会产生 0.5MB的内存来序列化bundle文件,直到Unload掉,后面用高版本5.6.6发现并没有这样的内存开销。对于bundle的大小,一方面要避免资源的冗余,一个资源被打进多个bundle中,这样不但会增加包体的大小还造成运行时内存存在多份同一资源,另一方面要避免太多资源被同时打进一个bundle不利于运行时加载。

在说打包bundle前,先说下工程里资源文件夹的目录结构,好的目录结构资源存放可以让你更清晰了解你的工程资源,便于管理,不管是开发初期,还是后期的版本迭代维护都是百利而无一害。而如果资源随意乱放,你会发现越到后面维护起来越麻烦,不但你打bundle时会麻烦,bundle之间依赖也会很多,不利于运行时的bundle加载卸载。整个项目资源是团队共同协作的,所以在项目初期就定好规范是很有必要的。

工程的资源可以分成三大类:

  1. 无需代码动态加载的原始资源目录AssetsRaw ,比如模型,贴图等
  2. 要代码动态加载的资源目录ResData,比如预设,音效,配置文件,场景等
  3. 各种插件目录3Party

可以根据上面三种类型在Assets目录下创建对应的文件夹再细分到对应下面的各个模块,而对于bundle打包来说其实最关心的是就是第二类型,遍历收集ResData目录下资源的外围依赖资源,再根据自己的打包策略打去打包。

在Editor模式下获取资源依赖的资源接口                                                                                                                                             string[] ds = AssetDatabase.GetDependencies(file);                                                                                                                          ***注意这个ds中可能包含资源文件file本身,处理的时候要注意下

Unity构造bundle资源单位有两种接口,一个是AssetBundleBuild类:

List<AssetBundleBuild> maps = new List<AssetBundleBuild>();                                                                                                        AssetBundleBuild build = new AssetBundleBuild();
  build.assetBundleName = abName;
  build.assetNames = new string[] { file1, file2 };
  maps.Add(build);

使用这个接口重视的是以bundle为单位,构建一个bundle单位时要确保你已经知道并收集到了哪些资源要放进该bundle中,然后指定它的包名跟这些资源文件就行了

另一个是AssetImporter类:

AssetImporter importer = AssetImporter.GetAtPath(file);
 importer.assetBundleName = abName;

使用这个接口更重视的是以单个资源文件为单位,指定其包名,而不用在意其它的资源会被指定什么包名被打进哪个bundle,所以用起来更方便。

以上两种方式对应对应以下最终的bundles生成接口

BuildAssetBundleOptions opt = BuildAssetBundleOptions.ChunkBasedCompression;
 1. BuildPipeline.BuildAssetBundles(outputPath, maps.ToArray(), opt, EditorUserBuildSettings.activeBuildTarget);
 2. BuildPipeline.BuildAssetBundles(outputPath, opt, EditorUserBuildSettings.activeBuildTarget);

对于打包选项BuildAssetBundleOptions选择用LZ4压缩,而不用默认的LZMA。简单说下这两种的区别

LZ4: 相对LZMA压缩比更低,所以打出来的包体会更大点,运行时解压更快而且没有额外的内存消耗,是从磁盘读取                  LZMA:相对LZ4压缩比更高,所以打出来的包体会更小点,运行时解压更慢而且有额外的内存消耗

注意可能遇到的问题:

  1. 有些shader文件会默认依赖某些贴图,如果该贴图打包时被打进的bundle里面有其它资源又依赖该shader所在的bundle,就会出现bundle互相依赖的情况,代码加载bundle的时候就有问题,因为要保证依赖包先加载进内存,所以打包的时候要避免这种情况。
  2. 引擎不识别.lua和.bin文件,所以即使给这种文件设置了包名也打不出对应的bundle,解决方法是添加.txt后缀
  3. 打完bundle后重启unity再打一次,会出现有些budle不可控的改变了(原资源未变),这种情况比较严重,因为这影响后面做更新包的大小。解决方法是使用增量打包,即保留上次打的bundle目录下.manifest文件

Unity热更新系列之一: bundle打包和打包策略相关推荐

  1. Unity热更新系列之 大版本更新应用覆盖安装问题

    应用版本迭代有时候我们不得不进行大版本升级,让玩家下载最新的包进行覆盖安装掉原来的包,覆盖安装这个动作是操作系统处理的,所以我们要遵循系统规则才能以正确的姿势覆盖掉之前的应用包,这里面有些需要注意的点 ...

  2. Unity热更新机制

    前言 游戏上线后,难免会有一些测试阶段没发现的bug,bug这东西,可大可小. 如果出现重大bug,而又没有热更技术,那么我们为了修复bug就只能强制玩家去商店下载新包,那造成的玩家流失是非常可怕的. ...

  3. [Unity热更新]04.卸载方式

    [Unity热更新]04.卸载方式 参考链接: https://www.jianshu.com/p/b37ee8cea04c 1.AssetBundle.Unload(false):释放AssetBu ...

  4. C# 实现 rtc_通过Xlua实现unity热更新的一个小例子

    通过Xlua实现unity热更新的一个小例子 一.介绍 ​ 热更新是指在更新游戏资源或者逻辑的时候不需要开发者将游戏再打包.发布.玩家重新下载安装包,而是可以通过将需要更新的资源打包成AssetBun ...

  5. unity案例 mysql lua_通过Xlua实现unity热更新的一个小例子

    通过Xlua实现unity热更新的一个小例子 一.介绍 ​ 热更新是指在更新游戏资源或者逻辑的时候不需要开发者将游戏再打包.发布.玩家重新下载安装包,而是可以通过将需要更新的资源打包成AssetBun ...

  6. unity热更新json_Unity热更新之AssetBundle打包篇

    unity3d在5.0之后打包Assetbundle变得比之前简单多了,最简单的办法就是把所有资源都标记Assetbundle的Flag,然后直接调用unity3d的打包Assetbundle即可,详 ...

  7. Unity 热更新方案之——ILRuntime

    文章目录 前言 一.ILRuntime是什么? 二.ILRuntime使用 1.跨域委托 2.跨域继承 3.CLR绑定与重定向 前言 做游戏离不开热更新,目前市面上热更新方案用的比较多的是Lua(XL ...

  8. Unity热更新技术整理

    一.热更新学习介绍 1.什么是热更新 举例来说: 游戏上线后,玩家下载第一个版本(70M左右或者更大),在运营的过程中,如果需要更换UI显示,或者修改游戏的逻辑,这个时候,如果不使用热更新,就需要重新 ...

  9. Unity热更新方案探索与讨论

    热更新必要性 App Store审核周期长 应用更新频繁 更新版本对留存数据有很大影响 Lua相关 Lua:脚本,解释性语言 LuaJit:扩展高效版本,支持编译成二进制代码. Tolua++:C/C ...

最新文章

  1. vue+elementUI项目的踩坑~~持续更新
  2. matlab小波变换边缘检测,在matlab 下 实现 用小波变换对图像进行边缘检测 程序代码...
  3. android 将byte[]保存到手机
  4. 推荐几个最近Star过的Github仓库
  5. java接口自动化(一) - 接口自动化测试整体认知 - 开山篇(超详解)
  6. Android 10 重磅来袭:支持 5G 与折叠屏、隐私安全全面升级!
  7. 2011-10-10
  8. 不用百度网盘客户端直接下载大文件
  9. cloopen java_GitHub - cloopen/java-sms-sdk: Yuntongxun SMS SDK for Java
  10. java : 实现微信网页授权,超详细!
  11. Element 中图片预览后如何快速关闭
  12. 居家办公小妙招、前后端在远程服务器上部署完成后怎么启动?
  13. 算法与数据结构实验题 10.23 寡人的难题
  14. android显卡效果吗,安卓模拟器显卡渲染模式中DirectX和OpenGL两个有什么区别?
  15. Codeforces Round #277.5 (Div. 2) A,B,C,D,E,F题解
  16. 计算(输入计算式得出结果)
  17. Java笔记(2)--java基础语法
  18. window下easymock本地部署非常详细流程,及问题解决
  19. js中isNaN和Number.isNaN的区别
  20. 滑头杨百万的股经:六分心态三分技巧一分运气

热门文章

  1. apple iMac一体机 装双系统 实战! (Apple +Win 7 64bit)Good
  2. BZOJ P1856 字符串
  3. 零、一些常用的英文名称
  4. 云XR平台支持沉浸式体验应用快速落地
  5. 什么是AOP,AOP能干什么,有什么优点
  6. 首次沙龙场面火爆,高能分享掌声不断,大咖观点集锦为你总结好了
  7. 【SSM框架】【怠惰致错】Invalid bound statement (not found)
  8. lol中国人最多的服务器,2021LOL哪个区人多_2021LOL服务器推荐
  9. HTML网页设计制作大作业(div+css)---浩瀚天文 (13页有二级菜单)
  10. 抖音怎么上热门网红 修改视频md5