【步兵 cocos2dx】热更新(下)

来源:互联网 发布:马龙丁宁知乎 编辑:程序博客网 时间:2024/06/07 02:35

【步兵 cocos2dx】热更新(下) By EOS.

上一篇把基本的理论都讲了一遍,接下来讲一下代码部分。
(ps:上下两篇讲完刚好,如果再来个上中下。。。岂不成三集篇了 =、=?)


热更否?

我这边启动文件是用的Launcher.lua,里边做了一些简单的判断,和平台信息的初始化,
如果是不是真机的话,我们可以跳过热更新或者设置跳过解密处理,这样能提高调试的速度。
如果需要平台是需要热更的话,就require热更文件updater.lua
接下来看一下里边的处理,进入热更检测阶段。

--不修改 cocos中的文件,在外部拓展覆盖。以后cocos跟新方便替换require "cocos.init"gm = {}--GameManagergm.TargetPlatform = CCApplication:getInstance():getTargetPlatform()if kTargetWindows == gm.TargetPlatform then    --噼里啪啦一堆处理    --不热更 直接进游戏    require "main" else    --热更    require "net.updater"end

热更检测

简单一点的方法,可以把一个文本文件丢到下载服务器上,然后根据里边的版本号进行处理。
用http::get就可以了,至于版本号,看个人需求,一般是xx.xx.xx.xx可以对外显示前三位,
保留第四位,做小补丁纠错,另外也可以只用前三位,然后在版本号中时间标志。
比如,1706110924_xx.xx.xx这样可以比较简单的做同版本号的更新,缺点就是必须把之前
已有的内容重新下载一边,还是推荐前一种方法,毕竟带资源更新消耗流量还是蛮吓人的。

当然更灵活的方式就是连接服务器,根据服务器的反馈的地址做资源下载处理,省心省力。


热更模块自更新

其实自更新也没难的,因为前边说了updater.lua,一看就知道是个lua文件,单独更新一下
它就好了,方法嘛,跟版本号同级,设置一个更新模块的版本号就可以了,
下载完成后把整个场景移除一下重新读取下载进度。又或者因为是一个单独的文件,
趁着跑logo的事件就可以下载好了,体验更好一点。


版本管理

我用的方法是版本列表的方式,也可以用txt存储一个,以倒序的形式存储。

xx.xx.02.02xx.xx.02.01xx.xx.02.00 

这样就具备了一个下载列表,可以对比客户端版本号高的资源包依次进行下载。具体代码

local function onSuccess()            progressLable:setString("["..dl_idx.."/"..#dl_list.."]".."downloading ok!")            assetsManager:deleteVersion()            dl_idx = dl_idx + 1            if dl_idx <= #dl_list then                --依次下载                assetsManager:setPackageUrl(dl_list[dl_idx].zip)                assetsManager:setVersionFileUrl(dl_list[dl_idx].vs)                assetsManager:checkUpdate()            else                assetsManager:release()                assetsManager = nil                --所有都下载结束                package.loaded["version"] = nil                cc.FileUtils:getInstance():purgeCachedEntries()                CurVersion = require "version"                updater.update()--检测是否是最新版本            end        end        --log.d("create assetsManager")        assetsManager = cc.AssetsManager:new(                        dl_list[dl_idx].zip,                                                 dl_list[dl_idx].vs,                        cc.FileUtils:getInstance():getWritablePath())        assetsManager:retain()        assetsManager:setDelegate(onSuccess, cc.ASSETSMANAGER_PROTOCOL_SUCCESS )        assetsManager:setConnectionTimeout(3)    end    --log.d("start download")    assetsManager:checkUpdate()

当所有的版本都下载结束后,就可以进去启动游戏的流程了。


总结

核心函数就那么几个

updater.getRemoteVersion    --先获取最新的版本好,判断是否更新updater.checkSelf           --发现热更模块不匹配,单独更新。下载完成后重新加载,在进行以上步骤if CurVersion == RemoteVersion then    require "main" --进入游戏else    updater.getVersionList()--获取版本列表,一次进行下载end updater.startDownLoad       --在getVersionList的http请求完成回调里进行--下载完成,再核对下版本,就可以进入游戏了。updater.showUpdateScene     --还有一个必不可少的,更新进度的界面

顺带一提,进度显示的方式,可以在资源列表后边加入资源的大小,

xx.xx.02.02[0.4m]xx.xx.02.01[0.1m]xx.xx.02.00[5.4m]

直接用检测到4个更新【1/4】 这种显示方式,然后刷新四遍100%,没毛病~
但是计算出总资源的大小就可以走一个100%的进度条,不是更友好么~

不过如果4个更新都没有上过线,基本就算是流失了=、= 除非你一天一更新?
还有应该提供一个基础包,从apk直接升级到xx.N.xx.00的基础包,这样对新用户更友好一些。
一进入游戏,发现40多个更新,看上去都想点取消了不是么。就这么多。晚安~
See Again~
之前
真爱无价,欢迎打赏~
这里写图片描述

原创粉丝点击