Unity3D热更新全书-何谓热更新,为何热更新,如何热更新
首先来赞叹一下中文,何谓为何如何,写完才发现这三个词是如此的有规律。
为何赞叹中文?因为这是一篇针对新手程序员的文字,是一节语文课。
然后来做一下说文解字,也就是
何谓热更新
热更新,每个程序员一听就明白,但是它语出何处,究竟表达了什么含义,到底代表了什么,对技术有什么要求,对经验相对较少的程序员来说可能就有一层神秘面纱了。
热更新,是对hot update 或者 hot fix的翻译,计算机术语,表示在不停机的前提下对系统进行更改。
hot 就是热,机器运行会发烫,hot就是不停机的意思。
热更新,是个很形象的词,机器烫的时候更新,开着更新。
比如Windows 不重启的前提下安装补丁
比如Http服务器在不重启的前提下换掉一个文件
那么对于Unity3D来说,何谓热更新?
额……这个真相实在是不想讲出来,因为很多时候,这个词都用错了。
Unity3D是一个客户端工具,用户是否重启客户端,根本是我们不关心的问题。
很多时候我们用着热更新这个词汇,却不需要真的热更新。
只有少部分游戏,游戏资源在玩的过程中边玩边下,不重启的前提下变更了资源。
我们不需要用户不重启客户端就能实现资源代码的更新,我们需要的是用户重启客户端能实现资源代码的更新。
让我们暂时放过这个我们的需求连词汇都用错了这个基本事实,来总结一下何谓Unity3D热更新
Unity3D热更新就是指:用户重启客户端就能实现客户端资源代码更新的需求或者功能。
为何热更新
热更新,能够缩短用户取得新版客户端的流程,改善用户体验。
没有热更新:
pc用户:
下载客户端->等待下载->安装客户端->等待安装->启动->等待加载->玩
手机用户:
商城下载APP->等待下载->等待安装->启动->等待加载->玩
有了热更新
pc用户:
启动->等待热更新->等待加载->玩
有独立loader的pc用户:
启动loader->等待热更新->启动游戏->等待加载->玩
手机用户:
启动->等待热更新->等待加载->玩
通过对比就可以看出,有没有热更新对于用户体验的影响还是挺大的,主要就是省去用户自行更新客户端的步骤。
为了方便用户、留住用户、进而从留住的用户身上赚到钱,热更新如今已经成为了大部分游戏的标配功能。
如果你的游戏不标配这个功能,那么竞争力就会少一些,无论是主动还是被动,无论是方便用户还是被标配,你都必须面对热更新这个课题,虽然这个词用错了。
如何热更新
热更新是为了让用户获得资源和代码的变更,这里的代码不是指真的代码,用户不要代码,他要的是变化的业务逻辑。实现变更的具体过程是首先查并更新本地资源和业务逻辑,如需下载则下载。然后启动时资源均从本地资源创建,业务逻辑从本地执行。
Unity3D提供了一种机制AssetBundle,可以满足所有资源的比对下载加载,但是assetbundle每平台分别打包对于多平台项目而言比较麻烦,是一个明显的短板,而且assetbundle不能脱离unityeditor产生,也是一个麻烦,项目大了话,多人合作,把所有资源都放入assetbundle明显降低效率。
对于代码,Unity3D是不提供变更机制的。但是Unity3D执行核心是Mono,也就是dotnet,dotnet有一种符号反射机制,可以直接加载一个dll,然后反射出其中的类型进行操作。符号和反射的主要问题是有些平台不能使用,比如ios wp8。另外dotnet有一种emit机制,可以运行时调用编译器对代码进行编译,他的问题也是平台不支持。
以上两点是Unity3D免费赠送给你的帮助
如果不能满足你的需求,你就需要自己搞定三个模块:
资源下载模块
当assetbundle不能满足需要时,我们需要自己建立检查更新需要则下载的机制,也就是资源下载模块。
这个资源下载模块应该有一个版本生成工具,我们将一组文件生成一个一个版本待下载。
有一个Unity3D用的下载模块,下载模块会首先检查服务器上的版本信息,和本地信息做比对,需要的文件则下载。
资源加载模块
然后需要建立自己的从下载保存在本地的文件中加载出资源的机制,也就是资源加载模块。
资源加载模块负责从下载的文件中加载出资源。
如果你希望游戏带有一份初始资源文件,这里有两种思路
一种是资源加载模块直接提供从包内文件和下载文件两种加载路径
一种是游戏第一次启动时,将包内文件全部copy到下载文件
脚本模块
当符号反射不能满足需求时,业务逻辑更新就只有套用脚本语言这一条路,也就是脚本模块。
虽然dotnet世界里有很多脚本可以用 ironRuby ironPython,可是在unity这个特定环境下全部不可用。
你可以使用的一个选择是lua,这个由魔兽世界采用作为界面脚本,从而红遍整个游戏行业,十年经久不衰的脚本。
unity有了很多lua的绑定库,也有了unilua这样的pure c#移植实现。
你还有一个选择是C#Light/Evil,他是C#语法的,pure c#实现的一门新生脚本语言,就是为了Unity3D逻辑热更新而生。
Unity3D热更新全书-何谓热更新,为何热更新,如何热更新的更多相关文章
- Unity3D热更新全书-PageZero
由于深刻的认识到自己是个思维跳跃的人,深入浅出是个我还要努力很久的目标,为了让大家不至于在我乱七八糟的文字中迷失,特整理目录一份 无分类 <Unity3D热更新全书-何谓热更新,为何热更新,如何 ...
- Unity3D热更新全书-重头再来
之前写了Unity3D热更新全书系列Blog 提出了下载.加载.脚本三个方面的开源类库 下载方面有EasyDown加载方面有GameObjParser脚本方面有C#Light另外有一个没有独立成库,但 ...
- Unity3D热更新全书FAQ
只要有程序员朋友们问过两次的问题 就会收录在此FAQ中 1.C#Light对比LUA有什么好处 C#Light是静态类型脚本语言,语法同C#,Lua是动态类型脚本语言,这两种都有人喜欢. 我更喜欢静态 ...
- 原来热加载如此简单,手动写一个 Java 热加载吧
1. 什么是热加载 热加载是指可以在不重启服务的情况下让更改的代码生效,热加载可以显著的提升开发以及调试的效率,它是基于 Java 的类加载器实现的,但是由于热加载的不安全性,一般不会用于正式的生产环 ...
- 处理ios webview 更新缓存本地css、js后webview缓存无法更新的问题
项目中需要使用app本地css.js,并且可以根据服务下发自动更新本地css.js.测试发现只要更新后的css或者js和更新前路径一致,webview加载的还是更新前的css.js.怀疑是webvie ...
- 关于KB905474正版验证补丁破解办法 KB905474是个微软操作系统正版/盗版监测间谍软件。更新安装后,右下角有个提示说“系统监测到你的操作系统是盗版”。 如果没有安装的: 在系统提示更新的时候注意看一下,如果包含有“更新KB905474”就去掉“更新KB905474”方框前的勾,点击关闭(注意如果没有去掉那个勾得话,会找不到“关闭”,而是“确定”),在不在提示我该消息前打勾。 如果已经安装
关于KB905474正版验证补丁破解办法 KB905474是个微软操作系统正版/盗版监测间谍软件.更新安装后,右下角有个提示说“系统监测到你的操作系统是盗版”. 如果没有安装的: 在系统提示更新的时候 ...
- 分布式系统中一些主要的副本更新策略——Dynamo/Cassandra/Riak同时采取了主从式更新的同步+异步类型,以及任意节点更新的策略。
分布式系统中一些主要的副本更新策略. 1.同时更新 类型A:没有任何协议,可能出现多个节点执行顺序交叉导致数据不一致情况. 类型B:通过一致性协议唯一确定不同更新操作的执行顺序,从而保证数据一致性 2 ...
- 微软在MSDN中更新了Win8.1批量授权版镜像(中文版更新完毕&版本说明)
微软在MSDN中更新了Win8.1大客户专业版和企业版镜像,零售版镜像(即专业版+核心版二合一镜像)没有更新,依然是9月份发布的版本.已证实,新的批量授权版镜像是集成了GA Rollup A更新,并且 ...
- listview前几个item的图片怎么是空白的、listview更新了ui不起作用、在handler里更新了UI不起作用
不是不起作用,不信你可以在更新ui代码附近加输出的log,说明程序是跑到那里了.但是未达到我们的想要的效果. 我们知道在listview里更新UI,listview的适配器Adapter里有个getV ...
随机推荐
- 搭建selenium自动化环境步骤
1.下载pythonhttps://www.python.org/downloads/2.安装2.X或者3.X3.添加环境变量python和pip(与python一起安装)4.下载setuptools ...
- filter之排除个别过滤
1.jsp 篇 一般拦截器设置都是拦截*.action.*.jsp等,如此我们可以扩展后缀名,逃过拦截: jsp的话,可以改成.jspf后缀. ( 把一个JSP文件命名为jspf扩展名,然后inclu ...
- 使用spring的特殊bean完成配置
1.分散配置 beans.xml配置如下: 使用占位符变量代替bean装配文件中的硬编码配置.占位符采用${variable}形式. 说明:当通过context:property-placeholde ...
- sql操作
SQL Server 存储过程 Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这 ...
- 【洛谷P3143】Diamond Collector
算是一道dp 首先,排序好每一个架子上都是一段区间,然后只需要统计每个点向左向右最长延伸的区间. 所以我们预处理出每个点以左.以右最大能延伸的长度(最多能选几个差值不超过k的) 然后枚举每个点作为断点 ...
- 区间型DP
区间型DP是一类经典的动态规划问题,主要特征是可以先将大区间拆分成小区间求解最后由小区间的解得到大区间的解. 有三道例题 一.石子合并 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆. ...
- Block循环引用问题研究
自从苹果在objc中添加Block功能支持以后已经过了很久.目前网上对于Block的使用有很多介绍.不过对于Block的内存管理问题,则是众说纷纭.再加上objc开始使用ARC以后,对于Block的内 ...
- zabbix中文乱码解决方法
将windows下的字体文件Fonts\simkai.ttf上传到zabbix的WEB目录下的fonts目录下 修改zabbix的PHP配置 将原来的DejaVuSans更改成simkai vim / ...
- 在Xcode 6 beta里编译Cocos2d-x iOS项目时失败
转载 在Xcode 6 beta里编译Cocos2d-x iOS项目时可能会失败,提示如下错误: Undefined symbols for architecture i386: "_fwr ...
- Jquery Mobile 学习笔记(一)
1.模拟器,IOS:XCODE GENYMOTION ANDROID:ECLIPSE GENYMOTION 2.jquery mobile data-role=page 代表一个页面 data-po ...