游戏版本比较的算法

在游戏开发和维护过程中,客户端都是不断更新的,伴随着每一次的更新,都会发布
一个更新补丁包来对旧的客户端进行更新,来使其变成新的客户端,补丁包应该包含
更新成新客户端的最少量资源(最大量资源就是整个新的客户端覆盖旧的)

更新程序通过读一个更新脚本,对旧的客户端进行文件添加,文件覆盖,文件删除等
操作来更新旧的客户端,当更新量比较少比较简单的情况下,更新脚本可以资源整理
人员自己写,但当更新量太大,资源多而杂的情况下,手写更新脚本就变得极容易出
错了,所以有必要开发一个工具自动查找两个版本的差异,自动生成更新脚本。

比较的方法:

假设有两个文件夹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中去。

  
通过上面的过程,两个文件夹的差异已经找出来了,这时就可以根据差异信息生成更新脚本,
同时把旧版本需要添加,覆盖,包内需要添加,覆盖的文件抽取出来,生成资源包。

下面截图是我写的一个版本比较工具的截图:
uploads/200803/21_153511_vctools.jpg


最后需要添加和替换的资源全部复制到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 >
如有转载,请注明 http://www.azure.com.cn/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值