需求
當游戲需要更新時,不必讓用戶下載新的完整包,
只需要通過游戲內部的更新系統自動更新差異包,達到節約用戶流量和時間的目的。
大體思路:
1.(游戲邏輯用lua等腳本編寫的情況)
這種方式的增量更新非常簡單,因為腳本本身可以當成資源來處理,只需要將腳本和其他資源(美術資源,配置檔)
從游戲的原包(apk)中剝離出來,每次版本更新將舊版本和新版本的資源包作對比,生產差異資源包即可。
2.(游戲邏輯用c++等編譯型語言編寫的情況)
這種方式相對來說復雜一些,展開說一下,以c++作為游戲主邏輯的開發語言為例。
分析:一般apk程序部分由java和c++兩部分組成,java部分主要負責與android平台相關的邏輯,而c++部分則主要
負責游戲的核心邏輯。通常我們將所有的核心邏輯編譯打包成一個後綴為.so的動態鏈接庫,游戲開始運行的時候由java
端通過jni調用動態庫中的本地函數來運行游戲的核心邏輯。而游戲更新部分除了資源包,剩下的就是這個.so文件(游戲
核心邏輯部分)。
需要做得事:
1.更新服務器,客戶端需要連接更新服務器下載差異包
2.客戶端更新模塊,負責客戶端版本的管理,需要從更新服務器上下載對應的差異包
3.文件差異對比生成工具,通過對比兩個不同版本的資源包來生產差異包。
1)更新服務器
一個簡單的支持http協議的web服務器,所有的版本差異包都放在裡面,當客戶端請求更新時,將對應的版本差異包所在位置的
url返回給客戶端,客戶端通過這個url從此服務器上下載差異包。比如客戶端發送如下請求http://xxx/version/update/1.2
意思是客戶端需要下載從1.1升級到1.2的差異包。
2)客戶端更新模塊
整個客戶端程序結構應該是這個樣子,(java部分)+(c++編寫的更新模塊部分)+(c++編寫的游戲邏輯部分),其中前兩個部分組成客戶端更新模塊,
兩個c++部分的代碼分別對應兩個.so文件,其中(c++編寫的游戲邏輯部分)的so文件將包含著差異包內,這樣游戲邏輯就能被更新。
更新具體流程:客戶端更新模塊讀取當前版本號,將版本信息發送給更新服務器檢查,如果是不是最新版本,則下載更新包。
a)java部分,所有跟平台登錄和支付相關的模塊必須全部放在這裡面
b)c++編寫的更新模塊部分,它負責連接更新服務器下載差異包,解壓,啟動游戲核心邏輯。注:因為游戲核心邏輯不在這個so文件裡面,所以通過更新模塊
調用核心邏輯的入口函數時,需要用到c++的動態函數調用技術,例如dlopen,dlsym這些函數
3)文件差異對比生成工具,可以自己寫,也可以用現成的,比如Beyond Compare。
這裡說一下版本差異包管理的兩種方式,
第一種是每次出新版本時,只需要生成與之前一個版本的差異包,玩家需要跨多個版本更新時,需要下載多個差異包,
舉例來說,現在游戲的最新版本是1.3,某一個玩家的游戲版本是1.1,那麼他需要先更新到1.2,再更新到1.3,不過整個過程應該是更新模塊自動完成。這種方式
的優點是每次出版本只需要出一個差異包,缺點就是玩家如果跨很多個版本更新時,將會耗費更多的時間和流量。
第二種是每次出新版本時,將最新版本和之前每一個版本都做對比,生成多個差異包,例如現在要出1.3的新版,那麼開發團隊需要做得就是生成一個1.3與1.1的差異包,
再生成一個1.3和1.2的差異包,這樣玩家就可以從任何一個版本一次性升級到最新版本,優點是玩家跨版本更新的時間和流量都減少,缺點是每次出版本需要耗費的時間更長。
最後說一下平台登錄和支付相關的模塊全部要放在客戶端更新模塊的好處,這樣每次出新版本時不過有多少平台,只需要生成一個通用的差異包,這樣就能大大減少維護和測試時間。