现在的位置: 首页 > 综合 > 正文

自己寻思的手机游戏更新策略

2017年02月16日 ⁄ 综合 ⁄ 共 2239字 ⁄ 字号 评论关闭


游戏更新是非常重要的,在研究了运用lua对安卓游戏进行动态更新后,采用了一种比较笨的更新方法。

在游戏安装包里加上一个本地资源管理的配置文件,我直接写工具导出.lua格式的文件,里面存放着在本地用到的资源文件名字以及更新的地址,还有md5值。

在游戏每次启动的时候都要下载个这种配置脚本,然后将服务器端资源的MD5和本地的比较,进行下载更新。

获得文件MD5的方法我用的是网上找的下面的一段代码:

public static string md5file(string file) {
  try {
   FileStream fs = new FileStream(file, FileMode.Open);
   System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
   byte[] retVal = md5.ComputeHash(fs);
   fs.Close();
   
   StringBuilder sb = new StringBuilder();
   for (int i = 0; i < retVal.Length; i++) {
    sb.Append(retVal[i].ToString("x2"));
   }
   return sb.ToString();
  } catch (Exception ex) {
   throw new Exception("md5file() fail, error:" + ex.Message);
  }
 }

把要获取文件的路径传进去就可以将文件的MD5值返回,我存放在一个Dictionary里面,这样本地的MD5就有了,之后再和配置表格里面的进行比较

变化了的就将配置表格里面的配置信息读取出来,在整个循环结束之后在将资源逐个更新检查,只要有不同的就会更新,这样不断循环保证资源是最新版本的

一直更新不成功就成死循环了,,

下面是我编写的比较方法

List<string> CompareLocalAndServerSource(){
  lacknum = 0;

  List<string> lackfilenames = new List<string> ();

  for( int i=0;i<localsourcename.Count;i++){
   FileInfo t =new FileInfo (路径);
   if(t.Exists){
    continue;
   }else{
    lackfilenames.Add(localsourcename[i]);
    lacknum++;
   }
  }

  if (lackfilenames.Count > 0) {
   isLACK = true;
   downloadnum = lackfilenames.Count;
   lacklist = lackfilenames;
  } else {
   localfileMD5 = GetLocalSourceMD5Value ();
   for (int i=0; i<localsourcename.Count; i++) {
    string dkey = localsourcename [i];
    if (localfileMD5.ContainsKey (dkey) || serverfileMD5.ContainsKey (dkey)) {
     if (localfileMD5 [dkey] == serverfileMD5 [dkey]) {
      continue;
     } else {
      lacklist.Add (dkey);
      lacknum++;//依据这个数量重新下载缺少的资源
     }
    } else {
     lacklist.Add (dkey);
     lacknum++;
    }
   }
  }
  if (lacknum == 0) {
   isLACK = false;
   StartLoadScene("加载场景");
  }
  else if (lacknum > 0) {
   isLACK = true;
   downloadnum = lacknum;
   nowdownloadcount =1;
   DownLoadTheCountOne(nowdownloadcount);//下载缺少的资源
  }
  return lacklist;
 }

有待项目验证、、、、、、、、

2014/12/10

公司做的一款游戏,我将我自己做的更新模块放进去了,经过验证是可以的,只是在根据是几需求,不断的改变着整个更新过程,改的太频繁了就是有些烦

现在主要的过程,当玩家下载游戏的时候,会从安装包里面将一些固有的资源释放到本地,其中最重要的就是资源信息的那个文件,我起的名字是configure,打在了

ab包里面,首先cs程序会将这个资源包率先写到本地,然后会对里面的lua程序进行编译执行,执行的第一步就是从指定的更新服务器里面将服务器那边放的资源脚本下载下来

,这样资源数据就会卸到本地了,这下子本地就会有这款游戏最新的资源的信息,然后根据配置表格里面的资源名称将安装包里面的资源写到本地,最后进行md5比对,

值不同的就从服务器那里下载,全部检查一遍之后,在进行一次比对,没有差别之后,就可以进入游戏喽,

对于老玩家直接就变成读取congfigure,然后下载服务器上面的配置表格,比对更新,进入游戏,哈哈,废话,实现起来还是要认真弄得,,这都是用lua写的过程,然后再cs哪里提供足够强大的工具接口给lua调用,就是在资源写入的时候,平台会卡一些的,我弄得全部下载的是10M左右,解压出来60M,进行下载configure,将包里面资源写到本地,解压,检查一遍,大概用的时间是5-6秒,手机上还会更慢,这个不知道怎么解决,也许涉及到文件读写,平台都会卡一些吧,继续努力吧

抱歉!评论已关闭.