【步兵 cocos2dx】热更新(下)

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

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


热更否?

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

--不修改 cocos中的文件,在外部拓展覆盖。以后cocos跟新方便替换
require "cocos.init"

gm = {}--GameManager

gm.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.02
xx.xx.02.01
xx.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~
之前
真爱无价,欢迎打赏~
赞赏码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值