Unity资源打包学习笔记(二)、如何实现高效的unity AssetBundle热更新
转载请标明出处:http://www.cnblogs.com/zblade/
0x01 目的
在实际的游戏开发中,对于游戏都需要进行打补丁的操作,毕竟,测试是有限的,而bug是无法预估的。那么在手游中,unity对于打补丁的方式就是提供热更新。本文主要针对assetbundle的热更新流程进行设计探讨,抛砖引玉,希望有更优的解决方案。
0x02 基本流程
在实际的游戏开发中,常常会被assetbundle的热更新折腾的无法入眠,每次在进行热更新的时候都需要反复测试,因为这牵涉着实际的上线游戏运行。
为了提高热更新的鲁棒性,优秀的做法,就是将热更新放在平时的开发中,伴随着开发中进行每天的热更新校验,让开发人员,策划人员,测试人员,甚至美术人员,都参与到实际的热更新中,这样可以在平时就测试出可能出现的Bug,从而避免在游戏需要热更新时候的紧急测试。
为了实现即时开发即时热更新的机制,我们就需要设计好热更新流程,明晰的设计方案,可以指导实际的开发工作。对于流程设计,我主要分为两个部分进行分别探讨:
1、如何快速打出assetbunle包
要实现ab的热更新,那么unity打ab就是一个关键点。在以前的项目开发中,打ab包,是一个很头疼的事情,特别是在资源量迭代增大之后,在后期的开发中,打ab包就是一个极为费时的步骤。
分析其费时的原因,是由于在每次打ab包的时候,如果每次都是重新打ab包,那么自然每次都是极为费时的。Unity提供了一种增量打包的方式,具体可以查看相关API,只要在固定的输出路径中进行增量打包,那么每次打ab包的时候,只会对变化(增删)和新增的ab进行重新打ab,所以只要分析好资源的依赖关系,然后设置好ab对应的name,剩下的增量打包操作只需要交给unity去执行即可。
2、基于快速打ab包,快速在真机上验证资源的更新
完成快速的ab打包后,只需要上传到资源机/cdn上,在手机上即可实现实时的ab更新,那么日常开发中如果对于美术资源在手机上的效果需要即刻测试,那么只需要提交资源,然后执行打ab操作,上传到资源机/cdn等上,然后更新到手机上快速验证效果。
3、基于快速打ab包,实现小包的打包方式
在日常开发中,每次打游戏包,都会带来安装包包体较大,特别是在游戏后期,资源量大,对应的游戏包包体极大,每次测试在安装的时候,下载包体就很费时。而快速打ab包,可以将这部分工作进行优化。每次打游戏包的时候,可以区分是否携带ab资源。如果不携带ab资源,那么整体的游戏包只需要进行代码编译和相关打包,而游戏中使用的资源,可以通过ab更新的方式,实时更新,每次有资源替换就更新ab资源,这样测试每天开启测试工作的时候,只需要少量更新,即可快速测试。
这样的小包模式,适合版本功能测试的分支开发中,如果Lua文件也用热更新的方式,那么一个小包可以较为持续的测试对应功能,当功能测试完成后,即可合并到主分支。
既然有小包,那么对应的就会有大包。这儿所谓的大包,就是将该版本的ab资源一起打入在游戏安装包中。在平时的资源提交中,都会触发对应的ab资源打包,所以当执行打打包的时候,耗费在ab中的实际不会很长,这样可以整体优化打安装包的时间。
0x03 如何利用jenkins来执行日常资源打ab包
说完快速打ab的优点后,说说怎么利用jenkins来实现快速打ab包。
日常简单的build工作,可以分配一台单独的资源打包机执行打资源ab包即可。利用开源的jenkins,可以较为快速的实现打ab操作。
jenkins可以配合Git/SVN实现相关的hook,在每次Git/SVN的服务器中,有push tag/post-commit操作的时候,都可以调用jenkins的API来执行相关的job。在相关job中调用unity的命令行来实现打ab操作。
如果存储空间允许,可以将工程切分为不同平台,利用Jenkins的pipeline实现并发打ab操作,实现高效的打ab包操作。
简易的效果图如下:

0x04 整体示意图
综上所述,可以画出整体示意图,懒得画了,就随手拍一张手绘吧 (忽略我的灵魂画法):D

Unity资源打包学习笔记(二)、如何实现高效的unity AssetBundle热更新的更多相关文章
- Unity资源打包学习笔记(一)、详解AssetBundle的流程
转载请标明出处:http://www.cnblogs.com/zblade/ 本文参照unity官网上对于assetBundle的一系列讲解,主要针对assetbundle的知识点做一个梳理笔记,也为 ...
- Unity基础知识学习笔记二
1,object Instantiate(object original,Vector3 position,Quaternion rotation) 克隆原始物体,并返回克隆物体. ...
- 【Unity Shaders】学习笔记——SurfaceShader(二)两个结构体和CG类型
[Unity Shaders]学习笔记——SurfaceShader(二)两个结构体和CG类型 转载请注明出处:http://www.cnblogs.com/-867259206/p/5596698. ...
- AJax 学习笔记二(onreadystatechange的作用)
AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...
- 【Unity Shaders】学习笔记——SurfaceShader(八)生成立方图
[Unity Shaders]学习笔记——SurfaceShader(八)生成立方图 转载请注明出处:http://www.cnblogs.com/-867259206/p/5630261.html ...
- 【Unity Shaders】学习笔记——渲染管线
[Unity Shaders]学习笔记——Shader和渲染管线 转载请注明出处:http://www.cnblogs.com/-867259206/p/5595924.html 写作本系列文章时使用 ...
- 【Unity 3D】学习笔记三十五:游戏实例——摄像机切换镜头
摄像机切换镜头 在游戏中常常会切换摄像机来观察某一个游戏对象,能够说.在3D游戏开发中,摄像头的切换是不可或缺的. 这次我们学习总结下摄像机怎么切换镜头. 代码: private var Camera ...
- Linux内核学习笔记二——进程
Linux内核学习笔记二——进程 一 进程与线程 进程就是处于执行期的程序,包含了独立地址空间,多个执行线程等资源. 线程是进程中活动的对象,每个线程都拥有独立的程序计数器.进程栈和一组进程寄存器 ...
- Unity资源打包之Assetbundle
转 Unity资源打包之Assetbundle 本文原创版权归 csdn janeky 所有,转载请详细注明原创作者及出处,以示尊重! 作者:janeky 原文:http://blog.csdn.n ...
随机推荐
- 在C++中怎么判断一个double型数据的小数点部分是否为零
例:double sf = 123.123: 这里我们怎么判断sf小数点部分是否为零,可以直接用原数减去将sf强制转换后的整数是否为零来判断. if((sf - (int)sf) == 0),则说明s ...
- BZOJ_1042_[HAOI2008]硬币购物_容斥原理+背包
BZOJ_1042_[HAOI2008]硬币购物_容斥原理+背包 题意: 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买s i的价值 ...
- 实验吧 ---- 隐写术之so beautiful so white
因为好久没有写博客,所以今天本宝宝要弥补这个过错,一下子更新许多文章,希望各位小伙伴能够原谅,以后我会加倍努力的! 这一次主要都是实验吧里面的 关于隐写术方面的知识,后续我会上传一些解密工具,希望能够 ...
- JDBC知识详解
一.相关概念 1.什么是JDBC JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它 ...
- hydra暴力破解ssh服务器密码
概述 我都没想到,第一次暴力破解服务器密码.竟然是对自己的单位服务器出手..囧,因为还没来得及找测试部要来服务器登录密码,测试部负责人已经下班走了.后来又联系不上,这要更新代码,怎么办..于是就对测试 ...
- .NETCore+EF+MySql+Autofac简单三层架构
前言 其实就是一个简单依赖注入的三层架构.记录一下,大佬们就不用看下去了.重点在最后面,可以直接拖到底去看. 正文 1.贴代码 1.整体的一个结构.大佬们应该一眼就看明白了. 2.MySqlConte ...
- 利用Asp.Net Core的MiddleWare思想处理复杂业务流程
最近利用Asp.Net Core 的MiddleWare思想对公司的古老代码进行重构,在这里把我的设计思路分享出来,希望对大家处理复杂的流程业务能有所帮助. 背景 一个流程初始化接口,接口中根据传入的 ...
- JavaScript 原型的深入指南
摘要: 理解prototype. 原文:JavaScript 原型的深入指南 作者:前端小智 Fundebug经授权转载,版权归原作者所有. 不学会怎么处理对象,你在 JavaScript 道路就就走 ...
- vue 设计一个倒计时秒杀的组件
简介: 倒计时秒杀组件在电商网站中层出不穷 不过思路万变不离其踪,我自己根据其他资料设计了一个vue版的 核心思路:1.时间不能是本地客户端的时间 必须是服务器的时间这里用一个settimeout ...
- postgresql 使用pg_restore时显示role "root" does not exist的解决办法
在docker里恢复bakcup格式的数据库,结果提示role "root" does not exist 解决方法: 切换用户: su - postgres 然后再次运行命令: ...