无论是小游戏也好还是其他游戏,都会把一些图片,多媒体资源放到云端,减少包得大小,等用户打开游戏后再时事加载,如果网络部好,或者等游戏正在加载得时候断网了,好多游戏就会卡死,这样得用户体验很糟糕,接下来我就教大家如果处理这样得问题。
- 我就部从下载开始了 ,上一篇有教大家如果使用微信云存储,和显示进度条https://www.cnblogs.com/zhangzhaowei/p/12343966.html
- 上面那种就没有做网络卡死和异常处理,导致有的打开小游戏直接卡死黑屏,或者进度条不动了,然后造成小游戏的用户丢了了很多,这样太糟糕了,鱼是我做了改进。
- 下面具体就来看看我的解决方案。
- 1分析问题
造成下载问题,大部分两个方面,一个是网络不好,导致资源无法下载下来;二是云端存储限制权限无法下载,CDN过期等等云端问题。
- 2假设方案
无论上面那种问题造成的,我们的客户端都不应该卡死或者黑屏幕,虽然CDN过期,我们会主动续费等等,但是作为用户端的体验我们应该做到更好的交互,所以当加载的资源失败,超时的资源我们应该提示下载失败,并且重新下载。这样用户至少知道是网络的问题,小游戏不背这个锅。
- 3具体方案,验证假设
我们接着https://www.cnblogs.com/zhangzhaowei/p/12343966.html这个代码改造,当一定时间下载未完成 ,我们视为下载失败,重新下载,这样下载递归,只要有失败就重新下载,但是递归的出口始终异步,这样会导致不一致,也就是新的一轮下载已经开始,但是上一轮下载还有失败的 ,并且唤起再一次的异常。这样就的话如果网络异常的话会不断的下载下去,反复下载,递归死循环了。
我们可以用一个更简单的方法,那就是规定一定的时间,如果下载时间超过这个时间,就视为下载失败,这时候先终止所有的下载,然后开启新一轮下载,知道下载完成。这个方案比起上面那个方案来说,如果网络不好是提示下载失败反复加载,但是网络恢复了 ,就会立马下载成功,完成下载。这样用户也知道什么情况,小游戏更不会卡死,黑屏了。
我们设定10秒钟如果下载不完成就重新下载,类似于刷新
wx.cloud.init({ env: 'test-x1dzi' }) downLoadPic() setTimeout(()=>{ if(netResourse.length != list.length){ wx.showToast({ title: '网络无连接,加载失败,正在重新加载!', icon: 'none', duration: 2000 }) for(let obj of downloadTaskList){ obj.abort() } run() } },10000)
判定已下载数量不等于被下载数量就视为下载失败,开启新的下载刷新
let downloadTaskList = [] let list = [] let index = 0 function downLoadPic() { list = [] downloadTaskList = [] index = 0 for (let obb of netResourse) { let task = wx.cloud.downloadFile({ fileID: obb.fileId, // 文件 ID success: res => { index++ let obj = obb obj.url = res.tempFilePath list.push(obj) initRender(ctx, index / netResourse.length * 100, image)//显示进度条 if (netResourse.length == list.length) {//下载成功 databus.allImages = list loadingImage() new Main(ctx) } }, fail: () => {} }) downloadTaskList.push(task)//添加下载任务,用于下载超时终止下载 } }
大体逻辑,和方案就这么简单,我才现在的游戏大体都这么做,可以试试用我的优化后的小游戏当正在加载资源的时候关掉网 ,然后反复加载的时候再开网验证下。