zip更新模式缓存是怎么读取的??

如果我们采用你们的第2种更新方式的话,用zip的方式,可以问下你们读取缓存是怎么读得吗??我们需要把这个zip文件解压到那个路径???服务端需要打update这个文件吗???你们是怎么检验这个缓存是否是最新的??可以解惑一下吗?? 我说一下我们现在遇到的情况,我们是游戏和大厅是分开的,使用dcc的话,我们必须把大厅和游戏资源全部放在一个目录里面打DCC,我们大厅有很多个,有时候我们更新了一个游戏资源,就必须全部大厅全部重新打一遍DCC,这样后期维护成本很高,看到你们zip的更新方式介绍,但是不是很明白你们这个是怎么更新的,怎么取缓存的,是否换成你们的zip更新可以解决我们问题,把资源一次性下载到本地,然后直接读取本地缓存,不是去读网络的资源。这样我们就可以把资源分开了
已邀请:

guozhaokui

赞同来自: vincent

zip更新先要理解这个文档: https://ldc.layabox.com/doc/?nav=zh-as-7-2-10
zip更新是基于dcc的,所以还要理解这个文档 https://ldc.layabox.com/doc/?nav=zh-as-7-2-10
再深入理解zip更新的话,就要看看 updateByZip 函数的实现(源码在最后)。
   . 用 updateByZip函数的话你就不用考虑下载到什么地方的问题了。
   . 服务器还要打dcc,但是不用包含这个zip文件
   . zip是否是最新的我们并没有去做,如果需要版本管理的功能需要你们自己实现。

zip更新是基于dcc的,所以dcc还是要打的,只是用zip相当于集中下载了。
你们的大厅和游戏虽然是分开的,但是同属于一个地址是吧。注意不同地址的话不能用同一个dcc的。
打dcc的话,应该很简单啊,如果在服务器端做,就是一句命令。不过,如果你们的游戏会越来越多的话,会导致dcc越来越大,这时候可以分开url,各自使用各自的dcc更好一些。或者我们可以考虑以后实现一个切换dcc的功能,即不再使用一个大dcc,而是可以随时在多个小dcc之间切换,这样更适合你们的需求。
 
下面是updateByZip的源码,你可以自己理解一下,然后修改一个自己的版本:
 
/**
* 更新。
* @param {string} url zip下载地址
* @param {(event:string,downloadPercent:number,curfile:string)=>boolean} onEvent 事件的回调。
* 事件名称:
* 'downloading' 下载中,这时候downloadPercent有值
* 'downloadError' 下载错误
* 'downloadOK' 下载成功。
* 'updating' 更新中,这时候 curfile有值,表示正在更新的文件
* 'updateError' curfile更新错误。因为curfile不在dcc列表,或者文件内容与dcc内容不一致。少量更新错误可以忽略,因为在实际使用的时候还是会下载
* 'unknownError'
* @param {function(localfile:string):void} onEnd 更新完成的回调
*/
window['updateByZip'] =function(url, onEvent, onEnd){
let cachePath = conch.getCachePath();
let localfile = cachePath+url.substr(url.lastIndexOf('/'));
/**
* 下载文件,保存到localfile中。
*/
downloadBigFile(url,localfile,
//进度回调
(total:number,now:number,speed:number)=>{
onEvent('downloading',Math.floor((now/total)*100),null);
return false;
},
//完成回调
(curlret:number,httpret:number)=>{
if(curlret!=0 || httpret<200||httpret>=300){
onEvent('downloadError');
//throw 'download error';
}else{
onEvent('downloadOK');
//let md5 = calcmd5(fs_readFileSync(localfile));
//console.log('md5='+md5);
let zip = new ZipFile();
if(zip.setSrc(localfile)){
zip.forEach((id,name,dir,sz)=>{
if(!dir){
let buf = zip.readFile(id);
//console.log("update "+name);
let fid = window.appcache.hashstr('/'+name); //TODO 测试
if(window.appcache.updateFile(fid,0,buf,false)){
//更新成功
onEvent('updating',null,name);
}else{
//更新失败。
/**
* 更新失败是指没有对应的dcc信息,或者文件内容与dcc中的不一致。
* 这个可以看做不是致命错误。
*/
onEvent('updateError',null,name);
//console.log("update error :"+name);
}
}
});
zip.close();
if(onEnd) onEnd(localfile);
}else{
console.log( 'set zip src error!');
onEvent('unknownError');
}
}
},10,100000000);
}

tangdelphi

赞同来自:

我也需要这个功能啊,我大厅 里面有很多游戏,资源可能同名,能分文件夹吗?

 渡

赞同来自:

兄弟我这边是update error found table xxxxx,知道咋回事吗?我是dcc文件读取完了再去解压的

要回复问题请先

商务合作
商务合作