在用户网速较慢的时候,游戏文件加载我们会遇到这样的一个情况,当前正在加载一些文件的时候又想打开另一个场景,需要加载另一些文件。egret加载队列的机制是 同等优先级的文件“先请求先加载”,也就是说需要等之前队列中的文件先加载完才会加载新的场景文件。
这个体验不是最好的用户体验,用户想进入新场景,但是迫于http连接数量和加载速度的限制,导致要等一会儿才能进入新场景,这和我们产品需求是不符的。
有没有办法呢?白鹭官方也想到了RES.loadGroup() 是有Priority属性控制优先级的,但是,只是加载Group才有,其他加载方式是不支持的。
进一步分析源码发现,RES.getResByUrl 和 RES.getResAsync api 加载的优先级官方默认设置成了最低优先级,而且无法修改!通过eui创建的Image对象底层对象都是用的这2个方法。
怎么办?想在业务层面更好的提示加载体验,那就只有自己修改源码了,引入清理队列的机制。当有优先加载的文件时,手动调用清理还处于等待加载的文件队列。这样以最快的速度加载到目标文件。
修改文件:Egret\engine\引擎版本\build\assetsmanager\assetsmanager.js
/**
* 自定义清空未加载队列的请求列表
* 使用方法:RES.queue.clearWaitList && RES.queue.clearWaitList();
*/
ResourceLoader.prototype.clearWaitList = function () {
this.failedList.length = 0;
var exuteFile = [];
var resInfo;
var list = this.itemListPriorityDic[Number.NEGATIVE_INFINITY];
if(list){
for(var i=0; i<list.length; i++){
resInfo = list[i];
delete this.promiseHash[resInfo.root + resInfo.name];
delete this.dispatcherDic[resInfo.root + resInfo.name];
exuteFile.push(resInfo.root + resInfo.name);
}
list.length = 0;
}
//-这里是loadGroup加载队列
for(var priority in this.itemListPriorityDic){
var list = this.itemListPriorityDic[priority];
if(list){
for(var groupname in this.promiseHash){
for(var i=0; i<list.length; i++){
resInfo = list[i];
if(resInfo.groupNames && resInfo.groupNames.indexOf(groupname) != -1){
delete this.promiseHash[groupname];
delete this.dispatcherDic[groupname];
exuteFile.push(groupname);
break;
}
}
}
list.length = 0;
}
}
return exuteFile;
};