动态加载界面所需资源

资源的动态加载

一场战斗开始前务必要加载好相应的资源,让战斗在展示播放的过程中保持流畅和不卡顿,将极大改善游戏体验。当然了,如果要加载所有英雄资源组肯定会造成极大的开销和浪费,务必需要自己实实一套独立的动态加载机制,不仅运用于战斗,也运用于所有需要的场景下。以战斗为例,涉及到的资源是由双方英雄决定的,那么在进入战斗画面开始前,在已经知晓了双方出站英雄的索引id后,通过索引id去找出所有参战英雄的相关资源,如:技能特效、技能buff特效、人物动画、人物立绘等等。将这些涉及到的资源放入一个临时资源组中,在界面创建时候动态加载这个临时资源组,离开界面时销毁这个资源组即可。

目前技术支持动态配置静态表,动态配置网络请求,动态配置资源组。开发根据情况在preloadtool和systemproxy中进行配置。
优化:
1.最好将动态配置方法均转移至其他工具类中,使加载逻辑与动态配置逻辑相分离。
2.暂不支持同一个场景的预加载中,相互依赖的网络请求进行动态配置。如活动数据。

打开一个界面时,在依次检测加载这个界面所需的静态表、通信端口后,在最后一步对动态资源进行加载,需要自定义实现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
/**
……场景加载逻辑
**/
if (this.loadIndex < this.loadMax) {//检查动态资源组
this.check_dynamic_group();
}

private DYN_GNUM = {}
private check_dynamic_group(): void {//最后检查动态资源组
let arr = this.get_dyn_arr(this.obj);//obj是创建界面时候传入的参数
this.DYN_GNUM[this.loadScreen] = this.DYN_GNUM[this.loadScreen] || 1;
if (arr.length) {//存在动态资源组
let gname = this.loadScreen + "1";
if (this.DYN_GNUM[this.loadScreen] == 1 || arr.length > 1) {//第一次加载或者有多个资源
gname = this.loadScreen + this.DYN_GNUM[this.loadScreen];
RES.createGroup(gname, arr);
this.DYN_GNUM[this.loadScreen]++;
}
this.loadAssets.push("assets." + gname);
//继续加载下一项
this.load_next();
} else {
//没有动态资源 直接预加载
this.pre_complete();
}
}

private get_dyn_arr(data){
let arr = [];
let c_d = data.param;
let cname = data.name;
switch (cname) {
case FightView.S_NAME:
arr = function(){}//方法自实现,按英雄id找出所有英雄技能和buff,将涉及到的特效、动画、立绘、资源图等存放到arr数组里
break;
/*...后续有其他场景需要,则继续添加场景名和对应实现方式即可*/
}
let skins = window && window["skins"];
if (!(skins && skins[cname + "Skin"]) && RES.hasRes(cname + "Skin_exml")) {
arr.push(cname + "Skin_exml");
}
return arr;
}