一,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封装了热更模块,AssetsManager
、AssetsManagerEx
。
AssetsManager
采用了第一种热更方式。通过版本号对比,获取需要下载的所有补丁包,解压到优先搜索路径下。
AssetsManagerEx
采用了第二种热更方式。通过获取服务器上最新资源与当前客户端的资源进行对比,逐个下载有差异的资源(该方式需请求多次)。
3、cocos2dx-lua游戏热更流程
- 定义更新的版本结构文件,可以是cocos2dx已有的结构文件定义,也可以是自身定制的格式。(与服务端协议好)
- 通过定义的结构判断是否需要更新。有则通过差异包/逐个文件拉取的方式更新,放置到优先搜索路径下。(更新方式可自己选择,前两步只要能够下载到最新资源即可)
- 利用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更新
开发过程中的更新,这个只能是辅助工具。当然还有些没有解决的问题,先挂着。。