一,cocos2dx-lua 热更

热更,与传统应用更新区别,在于不需要打APK或IPA包。将新资源和代码下载到客户端,通过 覆盖/优化搜索 的方式,利用Lua语言的特性,运行最新资源。

1、cocos2dx-lua 热更方式

  • 版本补丁包热更

补丁包热更,每个版本之间产生一个差异包,客户端检测与服务器上放置的最新版本之间的区分,依次下载差异包。例如客户版本是1.1.1,服务器上放置的版本是1.1.3,则,依次下载,1.1.2与1.1.1的差异包,1.1.3与1.1.2的差异包。

  • 单个文件修改更新

服务器上放置最新版本的全部资源 例如cocos2dx是res/src两个资源 和该最新资源的版本号,资源MD5列表,客户端通过对比,找出有差异的MD5资源,进行请求服务器下载。

  • 其他更新方式

最新版本对之前所有版本的差异包,例如最新版本为1.1.3,那么服务器上需要放置1.1.3->1.1.2,1.1.3->1.1.1的更新包。

该方式如果版本更新速度较快,则会导致每次发一个版本,需要放置很多个更新包,例如1.1.6,则需要放与1.1.5,与1.1.4,与1.1.3,与1.1.2,与1.1.1的更新包

全量更新,每次都下载整个包的资源、代码。该方式简单粗暴,但是缺点也很明显,需要更新很多无需修改的内容。

so的热更需要重启,在Android MainActivity里Load新的so

2、cocos封装的热更模块

cocos封装了热更模块,AssetsManagerAssetsManagerEx

AssetsManager 采用了第一种热更方式。通过版本号对比,获取需要下载的所有补丁包,解压到优先搜索路径下。

AssetsManagerEx 采用了第二种热更方式。通过获取服务器上最新资源与当前客户端的资源进行对比,逐个下载有差异的资源(该方式需请求多次)。

3、cocos2dx-lua游戏热更流程

  1. 定义更新的版本结构文件,可以是cocos2dx已有的结构文件定义,也可以是自身定制的格式。(与服务端协议好)
  2. 通过定义的结构判断是否需要更新。有则通过差异包/逐个文件拉取的方式更新,放置到优先搜索路径下。(更新方式可自己选择,前两步只要能够下载到最新资源即可)
  3. 利用lua语言的特性,将package.loaded,package.preload已加载的模块进行卸载(置为nil),重新加载,则此时会运行最新的资源、代码。

– 清除缓存,从引用层级高到低进行释放
cc.SpriteFrameCache:getInstance():removeUnusedSpriteFrames()
cc.Director:getInstance():getTextureCache():removeUnusedTextures()
cc.FileUtils:getInstance():purgeCachedEntries()

下载完资源后,清空缓存,重启游戏。不仅可以从Lua侧实现,也可以通过C++侧实现。
1.lua侧发送消息,C++侧监听
2.C++侧监听到消息后LuaEngine

总结:

cocos2dx-lua游戏的热更就是通过下载最新的资源、代码,利用Lua语言的特性,重新加载最新的资源、代码,完成热更。

二、开发过程中的Lua更新

开发过程中的更新,这个只能是辅助工具。当然还有些没有解决的问题,先挂着。。