[cocos4.0 + lua]熱更新
阿新 • • 發佈:2020-09-09
原理:
每次登陸游戲利用cocos的assetManager從伺服器拉去當前最新的兩個檔案。 一個是version.mainifest,一個project.mainifest. 這兩個檔案都是xml的描述檔案。一個包含了版本資訊,第二個包含了遊戲所有資源的MD5碼。首先通過version檔案對比本地的版本是否相同,如果不相同,再通過跟本地的project檔案對比MD5碼來判斷哪些檔案需要重新下載,替換資源。
步驟:
1. 有一個檔案下載的熱更新伺服器,將最新專案資源(res/ src/ 目錄)放入熱更新伺服器中,新增版本資訊母檔案(version_info.json)和python指令碼檔案eneateManifest.py(生成project.manifest、version.manifest檔案)。
2.version_info.json檔案: 主要用來配置資訊
{
"packageUrl" : "http://ip:port/update/MyProj/assets/",
"remoteManifestUrl" : "http://ip:port/update/MyProj/version/project.manifest",
"remoteVersionUrl" : "http://ip:port/update/MyProj/version/version.manifest",
"engineVersion" : "3.3",
"update_channel" : "Android",
"bundle" : "2018111701",
"version" : "1.0.0",
}
3.eneateManifest.py檔案: 這個檔案是一個python。目的是生成對應的version和project檔案。project檔案可以幫你給每個資源生成獨一無二的MD5碼,相當於每個資源的標記。下面是一段python檔案的程式碼。
#coding:utf-8
import os
import sys
import json
import hashlib
import subprocess
import getpass
username = getpass.getuser()
# 改變當前工作目錄
#os.chdir('/Users/' + username + '/Documents/client/MyProj/')
assetsDir = {
#MyProj資料夾下需要進行熱跟的資料夾
"searchDir" : ["src", "res"],
#需要忽略的資料夾
"ignorDir" : ["cocos", "framework", ".svn"],
#需要忽略的檔案
"ignorFile":[".DS_Store"],
}
versionConfigFile = "version/version_info.json" #版本資訊的配置檔案路徑
versionManifestPath = "version/version.manifest" #由此指令碼生成的version.manifest檔案路徑
projectManifestPath = "version/project.manifest" #由此指令碼生成的project.manifest檔案路徑
# projectManifestPath = "/Users/ximi/Documents/client/MyProj/res/version/project.manifest" #由此指令碼生成的project.manifest檔案路徑(mac機)
class SearchFile:
def __init__(self):
self.fileList = []
for k in assetsDir:
if (k == "searchDir"):
for searchdire in assetsDir[k]:
self.recursiveDir(searchdire)
def recursiveDir(self, srcPath):
''' 遞迴指定目錄下的所有檔案'''
dirList = [] #所有資料夾
files = os.listdir(srcPath) #返回指定目錄下的所有檔案,及目錄(不含子目錄)
for f in files:
#目錄的處理
if (os.path.isdir(srcPath + '/' + f)):
if (f[0] == '.' or (f in assetsDir["ignorDir"])):
#排除隱藏資料夾和忽略的目錄
pass
else:
#新增非需要的資料夾
dirList.append(f)
#檔案的處理
elif (os.path.isfile(srcPath + '/' + f)) and (f not in assetsDir["ignorFile"]):
self.fileList.append(srcPath + '/' + f) #新增檔案
#遍歷所有子目錄,並遞迴
for dire in dirList:
#遞迴目錄下的檔案
self.recursiveDir(srcPath + '/' + dire)
def getAllFile(self):
''' get all file path'''
return tuple(self.fileList)
def CalcMD5(filepath):
"""generate a md5 code by a file path"""
with open(filepath,'rb') as f:
md5obj = hashlib.md5()
md5obj.update(f.read())
return md5obj.hexdigest()
def getVersionInfo():
'''get version config data'''
configFile = open(versionConfigFile,"r")
json_data = json.load(configFile)
configFile.close()
# json_data["version"] = json_data["version"] + '.' + str(GetSvnCurrentVersion())
json_data["version"] = json_data["version"]
return json_data
def GenerateVersionManifestFile