cocos2dx lua 热更新

文章新地址

原理

  每次登陆游戏利用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"]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南锋1

您的打赏是我继续创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值