思考并回答以下问题:
- 回想一下你玩过的游戏,哪些用到了热更新技术?带来了什么好处?
- 通过配置文件进行配置会有什么问题?
- 为什么Unity热更新这个词不是传统意义上真正的热更新?
- 有没有热更新对用户体验有什么区别?
- 热更新分为资源内容的更新和代码逻辑的更新。有什么区别?
如果把项目发布出来,发现有个BUG,修改了一行代码就得重新发布一遍么?
是的,因为代码需要编译。
那有没有什么办法可以不重新发布,就能修改程序呢?
复习一下之前所学的内容,如果程序中的内容通过配置文件配置,是不是就不用修改代码就可以完成对程序行为的控制呢?
还真是。不过这些配置也是需要提前设计的,就没有比较通用的办法么?
当然也有了,这个就涉及到比较大的话题热更新了。
热更新
什么是热更新呢?
热更新,是对hot update或者hot fix的翻译,计算机术语,表示在不停机的前提下对系统进行更改。
更新大家应该都能明白,就是对原有的程序进行修复或升级。
那“热”是什么含义呢?
hot就是热,机器运行会发烫,hot就是不停机的意思。
热更新,是个很形象的词,机器烫的时候更新,开着更新。
- 比如Windows不重启的前提下安装补丁
- 比如Http服务器在不重启的前提下换掉一个文件
那么对于Unity3D来说,何谓热更新?
额……这个真相实在是不想讲出来,因为很多时候,这个词都用错了。
Unity3D是一个客户端工具(热更新一般指服务器后端),用户是否重启客户端,根本是我们不关心的问题。
很多时候我们用着热更新这个词汇,却不需要真的热更新。
只有少部分游戏,游戏资源在玩的过程中边玩边下,不重启的前提下变更了资源。
但更多时候我们不需要用户不重启客户端就能实现资源代码的更新(注:手机放在仓库里不使用,游戏客户端自动更新),我们需要的是用户重启客户端的时候能实现资源代码的更新。
让我们暂时放过这个我们的需求连词汇都用错了这个基本事实,来总结一下何谓Unity3D热更新。
Unity3D热更新一般指:用户重启客户端就能实现客户端资源或代码的更新(注:无需安装)。
热更新的好处
热更新能够缩短用户取得新版客户端的时间,改善用户体验。
没有热更新的时候:
pc用户:
下载客户端->等待下载->安装客户端->等待安装->启动->等待加载->玩手机用户:
商城下载APP->等待下载->等待安装->启动->等待加载->玩
有了热更新以后:
pc用户:
启动->等待热更新->等待加载->玩有独立loader的pc用户:
启动loader->等待热更新->启动游戏->等待加载->玩手机用户:
启动->等待热更新->等待加载->玩
通过对比就可以看出,有没有热更新对于用户体验的影响还是挺大的,主要就是省去用户自行更新客户端的步骤。
为了方便用户、留住用户、进而从留住的用户身上赚到钱,热更新如今已经成为了大部分游戏的标配功能。
如果你的游戏不标配这个功能,那么竞争力就会少一些,无论是主动还是被动,无论是方便用户还是被标配,你都必须面对热更新这个课题,虽然这个词用错了。
热更新的分类
热更新的内容分为两类:一类是资源内容的更新,一类是代码逻辑的更新。
资源内容的更新
资源内容的更新一般是采用AssetBundle的形式,将资源独立出来,客户端作为一个容器,资源作为外部的内容独立下载更新。
代码逻辑的更新
对于代码,Unity3D是不提供变更机制的(注:不像资源的更新,提供了AssetBundle,没有提供什么工具用来更新代码)。但是Unity3D执行核心是Mono,也就是dotnet,dotnet有一种符号反射机制,可以直接加载一个dll,然后反射出其中的类型进行操作。符号和反射的主要问题是有些平台不能使用,比如iOS。另外dotnet有一种emit(发射)机制,可以运行时调用编译器对代码进行编译,它的问题也是平台不支持。
那么对于占据半壁江山的iOS平台,有没有解决方案能覆盖主流平台呢?
目前较为主流的方案有两种:
- Unity + Lua:代表作有xLua、uLua、sLua等
- Unity + C#:代表作有ILRuntime、cshotfix等
总结
今天我们主要了解了一下什么是热更新,后面我们会逐步学习热更新方案的演进过程以及目前最主流的热更新技术xLua。