当前位置: 首页 > news >正文

FairyGUI-egret 优化ui资源加载

背景:egret重度游戏项目,ui资源都比较大,加载较慢,翻翻加载ui的源码看一下有没有优化空间:

https://github.com/fairygui/FairyGUI-egret/blob/master/source/src/UIPackage.ts

public static async loadPackage(resKey: string): Promise<UIPackage> {return new Promise<UIPackage>(async resolve => {let pkg: UIPackage = UIPackage._instById[resKey];if (pkg) {resolve(pkg);return;}const asset = await RES.getResAsync(getAssetResKey(resKey, "fui"));pkg = new UIPackage();pkg._resKey = resKey;pkg.loadPackage(new ByteBuffer(asset));let cnt: number = pkg._items.length;let tasks = [];for (var i: number = 0; i < cnt; i++) {var pi: PackageItem = pkg._items[i];if (pi.type == PackageItemType.Atlas || pi.type == PackageItemType.Sound) {tasks.push(RES.getResAsync(pi.file));}}if (tasks.length > 0)await Promise.all(tasks);UIPackage._instById[pkg.id] = pkg;UIPackage._instByName[pkg.name] = pkg;UIPackage._instById[pkg._resKey] = pkg;resolve(pkg);});}

可以看到代码里是先加载 .fui 的配置资源,等到它加载完成后,从其中解析出需要的 atlas\sound 资源,然后等待所有的资源加载,ui加载完成。而egret在运行会通过 assetsManager 加载全量资源的映射表,我们可以在此时建 收集每个fgui包的全部资源(即 .fgui配置 和 atlas\sound 资源),这样在loadPackage 时直接并行加载单个ui包的全部资源,理论上单个包的加载速度可以提升近一倍。

具体代码修改如下:

egret - assetsmanager:

src/extension/assetsmanager/src/core/FileSystem.ts

    export interface FileSystem {...+++++++++++++++++++++>>>>>> line 44collectFguiPkgAtlasAndSound(pkg:string, name:string):void;getFguiPkgAtlasAndSounds(pkg:string): string[];<<<<<<+++++++++++++++++++++  
}

src/extension/assetsmanager/src/core/ResourceConfig.ts

export class ResourceConfig {...+++++++++++++++++++++>>>>>> line 265public getFguiPkgItems(pkgName:string): string[] {return config.config.fileSystem.getFguiPkgAtlasAndSounds(pkgName);}
<<<<<<+++++++++++++++++++++      ...
}

src/extension/assetsmanager/src/processor/Processor.ts

                if (!fileSystem) {fileSystem = {...+++++++++++++++++++++>>>>>> line 639},fguiPkgAtlasAndSound: {},collectFguiPkgAtlasAndSound:(pkgName:string, name:string)=>{let temp:string[] = fguiPkgAtlasAndSound[pkgName];if (!temp) {temp = [];fguiPkgAtlasAndSound[pkgName] = temp;}temp.push(name);},getFguiPkgAtlasAndSounds:(pkgName:string)=>{return fguiPkgAtlasAndSound[pkgName];
<<<<<<+++++++++++++++++++++...}+++++++++++++++++++++>>>>>> line 667let fguiPkgAtlasAndSound: {[index:string]:string[]} = fileSystem['fguiPkgAtlasAndSound'];
<<<<<<+++++++++++++++++++++for (let resource of data.resources) {...
+++++++++++++++++++++>>>>>> line 678//fgui 资源if (resource.url.substring(0,10) == "assets/ui/") {let subfix = resource.url.substring(10+resource.name.length)switch(subfix) {case ".fui":fileSystem.collectFguiPkgAtlasAndSound(resource.name, resource.name);break;case ".mp3":let idx_ = resource.name.lastIndexOf('_');fileSystem.collectFguiPkgAtlasAndSound(resource.name.substring(0,idx_), resource.name);breakcase ".jpg":case ".png":let idx_atlas = resource.name.lastIndexOf('_atlas');fileSystem.collectFguiPkgAtlasAndSound(resource.name.substring(0,idx_atlas), resource.name);break;default:console.warn("unparsered fgui resource :" + resource.url);}}
<<<<<<+++++++++++++++++++++}
+++++++++++++++++++++>>>>>> line 702for(let key in fguiPkgAtlasAndSound) {let temp:string[] = fguiPkgAtlasAndSound[key];temp.sort(); //排序后第一个应为 .fui文件}
<<<<<<+++++++++++++++++++++

src/extension/assetsmanager/src/shim/Resource.ts

module RES {...
+++++++++++++++++++++>>>>>> line 320export function getFguiPkgItems(pkgName: string): string[] {return instance.getFguiPkgItems(pkgName);}<<<<<<+++++++++++++++++++++...export class ResourceConfig {...+++++++++++++++++++++>>>>>> line 829/*** 获取配置文件中 fugi 包的资源名合集* @method RES.getFguiPkgItems* @param pkgName {string} 包名* @returns {string[]}*/@checkNullpublic getFguiPkgItems(pkgName:string): string[] {return config.getFguiPkgItems(pkgName);}
<<<<<<+++++++++++++++++++++...}

FairyGUI

src/UIPackage.ts

public static async loadPackage(resKey: string): Promise<UIPackage> {...let keys = RES.getFguiPkgItems(resKey);for(let key of keys) {tasks.push(RES.getResAsync(key))}let assets = await Promise.all(tasks);pkg = new UIPackage();pkg._resKey = resKey;pkg.loadPackage(new ByteBuffer(assets[0]));...
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Linux--C语言之输入输出函数及格式控制输出
  • 如何在Shopify开发中高度还原Figma设计稿
  • 操作系统信号集与信号屏蔽
  • 社交工程攻击:心理操纵的艺术与防范策略
  • Nginx 服务器配置 SSL(HTTPS)的教程
  • 【langchain学习】从零开始掌握 JSONLoader:轻松解析复杂 JSON 数据
  • 【数据结构】五、树:7.哈夫曼树、哈夫曼编码
  • 物联网井盖-智能井盖-旭华智能
  • 【python】在Python中操作MongoDB的详细用法教程与实战案例分享
  • 北斗三号5G遥测终端机系统在水库大坝安全监测应用
  • 在 MySQL 中查找最小的缺失 ID
  • webrtc一对一视频通话功能实现
  • centos7 服务器搭建
  • 深度学习------------池化层
  • vue3 ts vite开发bug记录(类型转换)
  • 30秒的PHP代码片段(1)数组 - Array
  • Apache Spark Streaming 使用实例
  • DataBase in Android
  • Git的一些常用操作
  • idea + plantuml 画流程图
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • JavaScript设计模式系列一:工厂模式
  • JavaScript新鲜事·第5期
  • java取消线程实例
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • SegmentFault 2015 Top Rank
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • Vultr 教程目录
  • Web Storage相关
  • 基于遗传算法的优化问题求解
  • 通过git安装npm私有模块
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • ​linux启动进程的方式
  • ​Spring Boot 分片上传文件
  • ​决定德拉瓦州地区版图的关键历史事件
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (24)(24.1) FPV和仿真的机载OSD(三)
  • (3)nginx 配置(nginx.conf)
  • (7) cmake 编译C++程序(二)
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (笔试题)分解质因式
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (力扣题库)跳跃游戏II(c++)
  • (六)c52学习之旅-独立按键
  • (六)vue-router+UI组件库
  • (七)Flink Watermark
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (图)IntelliTrace Tools 跟踪云端程序
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (转)memcache、redis缓存