Lua开发手记
Posted Lua爱好者
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Lua开发手记相关的知识,希望对你有一定的参考价值。
今天来谈下Lua热更新,我姑且把它分为两部分:服务端热更新(本地)和客户端热更新(远程)。
服务端热更新
服务端热更新比较简单,说白了就是把新的脚本上传到服务器,然后让服务器将新的脚本重载即可,可以实现不停服更新,实现可参考。这里的重点是,保证在重载脚本时不要发生数据被覆盖修改即可。
比如我的方法是,将有数据状态的模块采用全局变量模式来写,类似if not a then a = XXX end 这种方式来实现,然后数据的初始化全部在一个Init函数里完成而不是写在脚本的trunk里(也就是这个模块的upvalue里),这样重载就只是将里面的函数实现给重载了。最后为了避免_G表不被污染,在游戏启动的时候,通过对_G设置metatable来将新添加的元素添加到一个指定表里(代表着 游戏中使用的所有全局变量),最后在所有的脚本初始化完后,将_G设为只读,避免游戏过程中生成乱七八糟的全局变量(要求使用者在最开始脚本加载的时候必须将全局变量全部声明完)。
客户端热更新
重点讲下客户端热更新,特别是对于手游开发,客户端能实现热更新是非常重要的。一个是避免玩家流失(每次强制玩家需要重新下载的版本更新一定会流失一批用户),第二个是避免一些小的bug fix或者功能改动无法及时更新到客户端。而如果有了热更新,可以说既可以快速对游戏进行修改,同时还可以让玩家强制更新,且对用户流失几乎没有太大影响(如果过程中没出其他问题的话),可以说是皆大欢喜了。
这里就不具体说明怎么coding了,只是介绍下方案思路。
将脚本文件按一定的规则划分成若干模块并打包。(之后的更新都将以模块为最基本单位,最极端的情况就是所有文件都打成一个包或者每个文件都是一个包)
做版本发布的时候,对每个包文件生成hash值并生成一个hash列表,同时用一个版本号文件记录版本号。
游戏启动之前,将本地的版本号与服务器的版本号做比对,如果发现版本低于服务器版本(这里会有一些强制更新检查的规则,比如大版本号低了或者版本低于某个指定值必须强制去渠道重新下载游戏包),则将服务器的版本hash列表拉取到本地与本地的hash列表进行比对。
记录本地hash列表与远程hash列表不同的模块包,然后逐个从更新服务器上下载对应的模块包文件到本地并解压到本地(如果可以直接覆盖原脚本最方便了,但移动端基本是没法这么做的)。
如果上述过程全部顺利完成,将本地的hash列表与版本号标记为与远程一致,更新结束。
更新完毕后,游戏在加载同名脚本时优先加载从远程下载解压的脚本即可。这里可以通过设置lua的package.path,或者修改lua源码的load函数等,方法很多,就不一一赘述了。
(顺带说下,我的游戏工程使用的是Unity开发,所以这里的模块包就直接使用的Unity的AssetBundle了,也不存在什么解压了,直接加载读取就可以了,hash列表也是unity自动帮你生成的。)
这套方案个人觉得比较好的一点是支持跨版本更新,不用一个个版本逐次升级,不好的地方就是可能会有冗余的下载量,不过脚本本身其实也没多大,都是按KB来计算,所以其实也不算什么问题了。当然,游戏目前还没正式上线,可能还有许多我没有考虑到的问题,也希望得到更有经验的朋友指点和批评。
以上是关于Lua开发手记的主要内容,如果未能解决你的问题,请参考以下文章