文档章节

游戏版本比较的算法[ZZ]

rise-worlds
 rise-worlds
发布于 2016/06/20 13:35
字数 1673
阅读 0
收藏 0

在游戏开发和维护过程中,客户端都是不断更新的,伴随着每一次的更新,都会发布
一个更新补丁包来对旧的客户端进行更新,来使其变成新的客户端,补丁包应该包含
更新成新客户端的最少量资源(最大量资源就是整个新的客户端覆盖旧的)
更新程序通过读一个更新脚本,对旧的客户端进行文件添加,文件覆盖,文件删除等
操作来更新旧的客户端,当更新量比较少比较简单的情况下,更新脚本可以资源整理
人员自己写,但当更新量太大,资源多而杂的情况下,手写更新脚本就变得极容易出
错了,所以有必要开发一个工具自动查找两个版本的差异,自动生成更新脚本。
比较的方法:
假设有两个文件夹A,和文件夹B,A是旧的客户端,B是新的客户端,需要通过算法来
找出两个文件夹的差异,并生成脚本,此脚本即明确的表明一些操作能将A变成B的过
程。
1.遍历A文件夹中的所有文件名,包括子目录,储存到O中去
2.遍历B文件夹中的所有文件名,包括子目录,储存到N中去
3.找出需要添加到旧版本中的文件:
通过遍历N中每个文件,查询是否在O中存在,如果不存在的文件则为需要添加的文
,储存到FA中去。
4.找出旧版本中需要删除的文件:
通过遍历O中每个文件,查询是否在N中存在,如果不存在则表示此文件需要删除,
并储存到FD中去。
5.找出旧版本中需要覆盖的文件:
通过遍历N中每个文件,找出在O中也同样存在此文件,这里把游戏用的资源包排除掉,
它们将在后面的操作中检测并更新,如果找到的两个相同的文件,比较文件内容只要
一个字节的内容不相同,则说明旧的版本中的此文件需要被新的版本中的文件覆盖掉
6.游戏资源包的更新操作:
通过遍历N中的每个为游戏资源包类型的文件,并查找O中是否
同样存在此文件,如果存在再比较两个内容是否相同,如果有一个字节不相同就表示内
容不同,则跳入下面包的更新操作中去。
a. 遍历旧包内的所有文件,储存到PO中
b. 遍历新包内的所有文件,储存到PN中
c. 找出旧包内需要添加的文件:
   通过遍历PN中每个文件,找出在PO中没有的,储存到PA中去。
d. 找出旧包内需要删除的文件:
   通过遍历PO中每个文件,找出在PN中没有的,储存到PD中去。
e. 找出旧包内需要覆盖的文件:
   通过遍历PO中每个文件,如果PN中也存在此文件,如果他们之间有一个字节不相同
   则表示旧包内的此文件需要覆盖掉,储存到PR中去。
通过上面的过程,两个文件夹的差异已经找出来了,这时就可以根据差异信息生成更新脚本,
同时把旧版本需要添加,覆盖,包内需要添加,覆盖的文件抽取出来,生成资源包。
下面截图是我写的一个版本比较工具的截图:

最后需要添加和替换的资源全部复制到resource目录下去
生成的更新脚本类似如下:

<VersionCompare>
  <Version Old="1.0" New="1.1" />
  <Resource Path="./resource/" />
  <UpdateActions>
    <FileActions>
      <Add From="0.dat" To="SkyBox/NewPictures/anc_elephantear1.PNG" />
      <Add From="1.dat" To="SkyBox/NewTexts/Apple.txt" />
      <Add From="2.dat" To="SkyBox/NewTexts/Pear.txt" />
      <Add From="3.dat" To="SkyBox/NewTexts/Orange.Txt" />
      <Add From="4.dat" To="TerrainMaterial/GoodLcuk.doc" />
      <Add From="5.dat" To="WaterColour/半兽人.mp3" />
      <Add From="6.dat" To="ABc1.sgp" />
      <Delete Where="SkyBox/bm00500SkyBox_BK.jpg" />
      <Delete Where="ShadowLayer/TerrainBlock16.tga" />
      <Delete Where="ShadowLayer/TerrainBlock36.tga" />
      <Delete Where="ShadowLayer/TerrainBlock44.tga" />
      <Delete Where="ShadowLayer/TerrainBlock63.tga" />
      <Replace From="7.dat" ToReplace="00500.xml" />
      <Replace From="8.dat" ToReplace="ShadowLayer/TerrainBlock46.tga" />
      <Replace From="9.dat" ToReplace="SkyBox/SkyBox.material" />
      <Replace From="10.dat" ToReplace="TerrainMaterial/TerrainMaterials.material" />
      <Replace From="11.dat" ToReplace="WaterColour/WaterColour_bm00500.tga" />
    </FileActions>
    <PackageActions Package="ShadowLayer/abc1.sgp">
      <Add From="12.dat" To="复件 skybox/terrainblock7.tga" />
      <Delete Where="00002.dat" />
      <Delete Where="00002.dat.addons" />
      <Delete Where="00002.xml.bak" />
      <Delete Where="bf00002.xml.bak" />
      <Replace From="13.dat" ToReplace="aaa.xml" />
      <Replace From="14.dat" ToReplace="skybox/lava_01.tga" />
      <Replace From="15.dat" ToReplace="skybox/skybox.material" />
      <Replace From="16.dat" ToReplace="复件 skybox/skybox.material" />
    </PackageActions>
    <PackageActions Package="SkyBox/abc1.sgp">
      <Add From="17.dat" To="shadowlayer/bm00500skybox_bk.jpg" />
      <Delete Where="skybox/bf00002skybox_bk.dds" />
      <Delete Where="skybox/bf00002skybox_dn.dds" />
      <Delete Where="skybox/bf00002skybox_fr.dds" />
      <Delete Where="skybox/bf00002skybox_lf.dds" />
      <Delete Where="skybox/bf00002skybox_rt.dds" />
      <Delete Where="skybox/bf00002skybox_up.dds" />
      <Delete Where="skybox/lava_01.tga" />
      <Delete Where="skybox/skybox.material" />
      <Delete Where="skybox/thumbs.db" />
      <Replace From="18.dat" ToReplace="aaa.xml" />
      <Replace From="19.dat" ToReplace="复件 skybox/skybox.material" />
    </PackageActions>
    <PackageActions Package="TerrainMaterial/abc1.sgp">
      <Add From="20.dat" To="新建文件夹/bm00500terrain.jpg" />
      <Delete Where="watercolour/bf00002wateredge.dds" />
      <Replace From="21.dat" ToReplace="aaa.xml" />
      <Replace From="22.dat" ToReplace="skybox/lava_01.tga" />
      <Replace From="23.dat" ToReplace="skybox/skybox.material" />
      <Replace From="24.dat" ToReplace="复件 skybox/skybox.material" />
    </PackageActions>
    <PackageActions Package="WaterColour/abc1.sgp">
      <Add From="25.dat" To="skybox/watercolour_bm00500.tga" />
      <Delete Where="shadowlayer/shadowlayer.rar" />
      <Delete Where="shadowlayer/terrainblock0.tga" />
      <Delete Where="shadowlayer/terrainblock1.tga" />
      <Delete Where="shadowlayer/terrainblock10.tga" />
      <Delete Where="shadowlayer/terrainblock11.tga" />
      <Delete Where="shadowlayer/terrainblock12.tga" />
      <Delete Where="shadowlayer/terrainblock13.tga" />
      <Delete Where="shadowlayer/terrainblock14.tga" />
      <Delete Where="shadowlayer/terrainblock15.tga" />
      <Delete Where="shadowlayer/terrainblock16.tga" />
      <Delete Where="shadowlayer/terrainblock17.tga" />
      <Delete Where="shadowlayer/terrainblock18.tga" />
      <Delete Where="shadowlayer/terrainblock19.tga" />
      <Delete Where="shadowlayer/terrainblock2.tga" />
      <Delete Where="shadowlayer/terrainblock20.tga" />
      <Delete Where="shadowlayer/terrainblock21.tga" />
      <Delete Where="shadowlayer/terrainblock22.tga" />
      <Delete Where="shadowlayer/terrainblock23.tga" />
      <Delete Where="shadowlayer/terrainblock24.tga" />
      <Delete Where="shadowlayer/terrainblock25.tga" />
      <Delete Where="shadowlayer/terrainblock26.tga" />
      <Delete Where="shadowlayer/terrainblock27.tga" />
      <Delete Where="shadowlayer/terrainblock28.tga" />
      <Delete Where="shadowlayer/terrainblock29.tga" />
      <Delete Where="shadowlayer/terrainblock3.tga" />
      <Delete Where="shadowlayer/terrainblock30.tga" />
      <Delete Where="shadowlayer/terrainblock31.tga" />
      <Delete Where="shadowlayer/terrainblock32.tga" />
      <Delete Where="shadowlayer/terrainblock33.tga" />
      <Delete Where="shadowlayer/terrainblock34.tga" />
      <Delete Where="shadowlayer/terrainblock35.tga" />
      <Delete Where="shadowlayer/terrainblock36.tga" />
      <Delete Where="shadowlayer/terrainblock37.tga" />
      <Delete Where="shadowlayer/terrainblock38.tga" />
      <Delete Where="shadowlayer/terrainblock39.tga" />
      <Delete Where="shadowlayer/terrainblock4.tga" />
      <Delete Where="shadowlayer/terrainblock40.tga" />
      <Delete Where="shadowlayer/terrainblock41.tga" />
      <Delete Where="shadowlayer/terrainblock42.tga" />
      <Delete Where="shadowlayer/terrainblock43.tga" />
      <Delete Where="shadowlayer/terrainblock44.tga" />
      <Delete Where="shadowlayer/terrainblock45.tga" />
      <Delete Where="shadowlayer/terrainblock46.tga" />
      <Delete Where="shadowlayer/terrainblock47.tga" />
      <Delete Where="shadowlayer/terrainblock48.tga" />
      <Delete Where="shadowlayer/terrainblock49.tga" />
      <Delete Where="shadowlayer/terrainblock5.tga" />
      <Delete Where="shadowlayer/terrainblock50.tga" />
      <Delete Where="shadowlayer/terrainblock51.tga" />
      <Delete Where="shadowlayer/terrainblock52.tga" />
      <Delete Where="shadowlayer/terrainblock53.tga" />
      <Delete Where="shadowlayer/terrainblock54.tga" />
      <Delete Where="shadowlayer/terrainblock55.tga" />
      <Delete Where="shadowlayer/terrainblock56.tga" />
      <Delete Where="shadowlayer/terrainblock57.tga" />
      <Delete Where="shadowlayer/terrainblock58.tga" />
      <Delete Where="shadowlayer/terrainblock59.tga" />
      <Delete Where="shadowlayer/terrainblock6.tga" />
      <Delete Where="shadowlayer/terrainblock60.tga" />
      <Delete Where="shadowlayer/terrainblock61.tga" />
      <Delete Where="shadowlayer/terrainblock62.tga" />
      <Delete Where="shadowlayer/terrainblock63.tga" />
      <Delete Where="shadowlayer/terrainblock7.tga" />
      <Delete Where="shadowlayer/terrainblock8.tga" />
      <Delete Where="shadowlayer/terrainblock9.tga" />
      <Replace From="26.dat" ToReplace="aaa.xml" />
      <Replace From="27.dat" ToReplace="skybox/lava_01.tga" />
      <Replace From="28.dat" ToReplace="skybox/skybox.material" />
      <Replace From="29.dat" ToReplace="复件 skybox/skybox.material" />
    </PackageActions>
  </UpdateActions>
</VersionCompare>

www.azure.com.cn

本文转载自:http://www.cnblogs.com/flying_bat/archive/2008/08/09/1264300.html

共有 人打赏支持
rise-worlds

rise-worlds

粉丝 2
博文 1755
码字总数 0
作品 0
深圳
程序员
私信 提问
linux安装及基本操作 (1)

1、Linux基本相关概念(1) 通常所说的linux指的是linux系统,其中包括linux内核,系统基本库和应用程序等组成部分。严格意义上讲,linux只是linux操作系统的核心,成为linux内核。对于任何操...

qq5a4f28f93b773
2018/01/05
0
0
[ZZ]变速齿轮作者的文章--绝杀反外挂方案

  自从网络游戏诞生以来外挂就一直是网络游戏厂商头痛的问题。由于网络游戏服务器端的负荷很重,不能进行太多计算,只能把大量检测外挂的工作放在网络游 戏的客户端进行。但是外挂也总是可...

RyaneLuo
2012/05/21
0
0
我也来开发2048之确定思路

以下内容拔自百度: 2048是比较流行的一款数字游戏。原版2048首先在github上发布,原作者是Gabriele Cirulli。它是基于《1024》和《小3传奇》的玩法开发 而成的新型数字游戏。随后2048便出现...

eclipse_xu
2014/04/19
0
0
细谈PHP多语种建站

公司产品网站不可能局限于中文,因为你的网站注册客户也许是美国人,韩国人,西班牙人等,你不得不面临网站多语种解决问题。 其实多语言网站很多,如谷歌网站,Facebook,code.org等 基于PHP...

crossmix
2015/12/28
34
2
使用 HTML5 Canvas实现移动平台动画(游戏)的一些痛点和思路

前言 最近一直在做一些HTML5 Canvas加速方面的事情,HTML5已经出来相当长一段时间,各浏览器厂商也基本上已经支持!从目前来看,HTML5的大规模普及还是雷声大,雨点小;但从长远来看,HTML5...

小云栖
2016/01/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring Boot 2.x基础教程:快速入门

简介 在您第1次接触和学习Spring框架的时候,是否因为其繁杂的配置而退却了?在你第n次使用Spring框架的时候,是否觉得一堆反复黏贴的配置有一些厌烦?那么您就不妨来试试使用Spring Boot来让...

程序猿DD
昨天
1
0
SpringSecurity认证流程源码级详解

SpringSecurity认证流程源码级详解 认证流程说明 认证结果如何在多个请求之间共享 获取认证用户信息

chendom
昨天
1
0
C语言中的volatile——让我保持原样

volatile译为:易变的。这不是和题目的让我保持原样矛盾了吗?其实不然,在变量前加上该关键字修饰,确实是告诉编译器,这个变量是一个容易改变的变量,不要对它进行优化,每次都要到变量的地...

天王盖地虎626
昨天
1
0
五、RabbitMQ的消息属性(读书笔记)

简介 当使用RabbitMQ发布消息时,消息又AMQP规范中的三个低层帧类型组成: Basic.publish方法帧; 内容头帧; 消息体帧; 这三种帧类型按顺序一起工作,以便消息传递时完好无损。 其中,内容...

XuePeng77
昨天
1
0
JavaEE开发的颠覆者SpringBoot实战摘要笔记

一、注解理解 1.spring注解 1)@Configuration/@ComponentScan/@Bean注解实现java方式的配置。 @Configuration代替xml文件 @ComponentScan指定扫描范围 @Bean代替bean标签 2)@Bean、@Componen...

啃不动地大坚果
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部