Egret资源管理解决方案

关于egret开发H5页游,资源管理和加载的一点看法。

一 多json文件管理

二 资源归类和命名

三 exml文件编写规范

四 资源预加载、分步加载、偷载

五 资源文件group分组

六 ResUtils,多json文件管理类

七 ResUtils,资源组加载管理类

八 开发中遇到的一点问题 

 

一 多json文件管理

当多人协作时,添加资源时常因为资源文件修改而导致svn冲突。

根据各人不同负责的模块,将资源文件划分。

原来的

default.res.json

可以修改为

login.res.json
hall.res.json
game.res.json
sound.res.json
...

新建的文件需要配置一下,否则无法使用,配置方法见下面《八 开发中遇到的一点问题》。 

 

二 资源归类和命名

asset文件夹下,分类存放图片。根据项目可自行划分。

 

为了防止多个文件中资源命名冲突,软件只有检测单文件中命名冲突,没有自动检测多文件命名冲突的功能。

所以可以加前缀解决。

login_loginbtn
login_logohall_roombg
hall_setbtngame_bg
game_option
....

 

对于公用的图片,尤其是login、hall、game中通用的按钮和背景,可以单独放在common资源组中,以备复用。

一来防止图片多次加载,导致发包体积过大。二来修改按钮图片时,只需修改一处即可。

com_btn0
com_btn1
com_box0
com_box1
com_panelbg
...

 

 

 三 exml文件编写规范

编写Exml文件时,为了二次修改,便于查找阅读,可以效仿Flash多图层的存放元件。

优点:

1. 当查找时,可以根据图层名查找到图片或文本。

2. 点击图层左侧眼镜,可隐藏该图层的所有组件。

缺点:

1. 单击选择时,只能选择最上层Group,而不能穿透Group选择到另一层的组件...比如直接点击界面是无法选择Logo这个文本的。(注:wing3.0已经解决了这个问题)

2. group折叠时,无法一目了然当前所有组件。

 

 

四 资源预加载、实时加载、偷载

1. 黑屏  

在进入preload预加载界面时,此时会有短暂的黑屏。可将html背景色设置为白色或其他颜色,感觉比黑屏要好一些。

2. 预加载

打开场景。 从preload进入login场景时,预先加载login界面的资源,给出加载loading界面,加载完成后再进入login。

 

 

 

3. 实时加载

预加载只加载用户一进入场景时所见资源,其他该场景资源,比如弹框资源等,在使用时再实时加载。这样可以大大减少用户进入场景等待时间。

在打开弹框时,给出loading动画,加载完后再显示弹框。

 

 

 

 

弹框除了资源,还有http请求显示的数据,这个请求也需要时间等待,未返回数据前,界面数据为空,或者显示之前请求的数据,等加载完成再显示更新。

如下图,当http请求无返回数据时,界面是空的,或者是之前请求的数据。

 

当http请求返回数据时,再更新该弹框。

 

 

 

3. 偷载

进入某场景后,用户可能不会马上进行某些操作。进入场景后即刻加载该场景所用资源。不用显示loading画面,在用户不知的情况完成加载。

 

五 资源文件group分组

资源文件可按照场景、弹框、通用来分组。

场景必须资源:preload、login、hall、game

大厅中弹框资源:option、rank、mission、skill、roleInfo

声音资源:sound

通用资源:common

根据项目可自行细分。

资源组划分的目的,就是将资源分类管理,方便在加载时使用。

在进入login场景时,只加载login资源组。打开设置弹框时,只加载option资源组。

 

 

 六 ResUtils,多json文件管理类

六、七代码部分参考了Egret论坛某人的代码,略微修改了一下。首先感谢这位仁兄分享自己的代码,其次我忘了他叫啥了- -! 。。。

ResUtils.ts

/*** 资源加载工具类,* 支持多个resource.json文件加载*/
class ResUtils  {private static instance:ResUtils;private _configs: Array<any>;private _onConfigComplete: Function;private _onConfigCompleteTarget: any;public static getInstance():ResUtils{if(this.instance == null){this.instance = new ResUtils();}return this.instance;}/*** 构造函数*/public constructor() {this._configs = new Array<any>();}/*** 添加一个配置文件* @param jsonPath resource.json路径* @param filePath 访问资源路径*/public addConfig(jsonPath: string,filePath: string): void {this._configs.push([jsonPath,filePath]);}/*** 开始加载配置文件* @param $onConfigComplete 加载完成执行函数* @param $onConfigCompleteTarget 加载完成执行函数所属对象*/public loadConfig($onConfigComplete: Function,$onConfigCompleteTarget: any): void {this._onConfigComplete = $onConfigComplete;this._onConfigCompleteTarget = $onConfigCompleteTarget;this.loadNextConfig();}/*** 加载*/private loadNextConfig(): void {//加载完成if(this._configs.length == 0) {this._onConfigComplete.call(this._onConfigCompleteTarget);this._onConfigComplete = null;this._onConfigCompleteTarget = null;return;}var arr: any = this._configs.shift();RES.addEventListener(RES.ResourceEvent.CONFIG_COMPLETE,this.onConfigCompleteHandle,this);RES.loadConfig(arr[0],arr[1]);}/*** 加载完成* @param event*/private onConfigCompleteHandle(event: RES.ResourceEvent): void {RES.removeEventListener(RES.ResourceEvent.CONFIG_COMPLETE,this.onConfigCompleteHandle,this);this.loadNextConfig();}
}

 

//加载多个资源文件
ResUtils.getInstance().addConfig("resource/test.json","resource/"); ResUtils.getInstance().addConfig("resource/test2.json","resource/"); ResUtils.getInstance().loadConfig(this.onConfigComplete, this);

 

 七 ResUtils,资源组加载管理类

 ResUtils.ts

/*** 资源加载
* 支持单个或多个资源组加载
*/ class ResUtils extends BaseClass {/**保存资源组名*/private groups: any;/*** 构造函数*/public constructor() {super();this.groups = {};RES.addEventListener(RES.ResourceEvent.GROUP_COMPLETE,this.onResourceLoadComplete,this);RES.addEventListener(RES.ResourceEvent.GROUP_PROGRESS,this.onResourceLoadProgress,this);RES.addEventListener(RES.ResourceEvent.GROUP_LOAD_ERROR,this.onResourceLoadError,this);}/*** 加载资源组,静默加载(无回调函数)* @group 资源组(支持字符串和数组)*/ public loadGroupQuiet(group){var groupName:string = this.combGroupName(group);RES.loadGroup(groupName);}/*** 加载资源组,带加载完成回调* @group 资源组(支持字符串和数组)* @onComplete 加载完成回调* @thisObject 回调执行对象* @priority 优先级*/ public loadGroup(group, onComplete:Function, thisObject:any, priority:number = 1){var groupName:string = this.combGroupName(group);this.groups[groupName] = [onComplete,null,thisObject];RES.loadGroup(groupName);}/*** 加载资源组,带加载进度* @group 资源组(支持字符串和数组)* @onComplete 加载完成回调* @onProgress 加载进度回调* @thisObject 回调执行对象*/public loadGroupWithPro(group ,onComplete: Function,onProgress: Function,thisObject: any): void {var groupName:string = this.combGroupName(group);this.groups[groupName] = [onComplete,onProgress,thisObject];RES.loadGroup(groupName);}/*** 组合资源组名。单个资源组直接返回。多个资源组则重新命名。* @group 新资源组名*/ private combGroupName(group){if(typeof(group) == "string"){return group;}else{var len = group.length;var groupName:string = "";for(var i=0;i<len;i++){groupName += group[i];}RES.createGroup(groupName,group,false); //是否覆盖已经存在的同名资源组,默认 falsereturn groupName;}}/*** 资源组加载完成*/private onResourceLoadComplete(event: RES.ResourceEvent): void {var groupName: string = event.groupName;console.log("资源组加载完成:" + groupName);if(this.groups[groupName]) {var loadComplete: Function = this.groups[groupName][0];var loadCompleteTarget: any = this.groups[groupName][2];if(loadComplete != null) {loadComplete.call(loadCompleteTarget);}this.groups[groupName] = null;delete this.groups[groupName];}}/*** 资源组加载进度*/private onResourceLoadProgress(event: RES.ResourceEvent): void {var groupName: string = event.groupName;if(this.groups[groupName]) {var loadProgress: Function = this.groups[groupName][1];var loadProgressTarget: any = this.groups[groupName][2];if(loadProgress != null) {loadProgress.call(loadProgressTarget,event);}}}/*** 资源组加载失败*/private onResourceLoadError(event: RES.ResourceEvent): void {console.log(event.groupName + "资源组有资源加载失败");this.onResourceLoadComplete(event);} }

 

测试加载

var res:ResUtils = ResUtils.getInstance();
//res.loadGroupQuiet("login");
//res.loadGroup("login", ()=>{ console.log("login load complete")}, this);
//res.loadGroupWithPro("login", 
//    ()=>{console.log("login load complete")}, 
//    (e:RES.ResourceEvent)=>{console.log("login progress",e.itemsLoaded,e.itemsTotal)},this);
      
res.loadGroupQuiet(["preload","login"]);

 

 八 开发中遇到的一点问题 

但是在egret wing2.5中,default.des.json改名后,就会使用不正常了。

找不到路径下的资源。

 

 

解决以上问题,需要在 项目-项目属性-资源 中添加配置文件。

 

转载于:https://www.cnblogs.com/gamedaybyday/p/6079694.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/572994.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 等待唤醒机制,Java线程等待唤醒机制

记录面试过程中被问到的几个需要手写代码的小案例1.请手写出线程的等待唤醒机制案例中两个线程&#xff1a;SyncSetThread设置学生信息&#xff0c;SyncGetThread用来获取学生信息&#xff0c;在Student实体中提供一个标记属性flag&#xff0c;记录当前是否有数据。等待唤醒机制…

Xshell实现Windows上传文件到Linux主机

经常有这样的需求&#xff0c;我们在Windows下载的软件包&#xff0c;如何上传到远程Linux主机上&#xff1f;还有如何从Linux主机下载软件包到Windows下&#xff1b;之前我的做法现在看来好笨好繁琐&#xff0c;不过也达到了目的&#xff0c;笨人有本方法嘛&#xff1b; 我是怎…

java实现键盘移动图片,快速移动视图与键盘

我试图在键盘出现时向上移动视图&#xff0c;在键盘隐藏时向下移动 .我遇到的问题是高度似乎不同&#xff1a;KBH1输出216&#xff0c;KBH2输出260 .这导致视图向下移动得比最初移动的距离更远 .我该如何纠正这个&#xff1f;extension UIViewController {func addKeyboardFunc…

python-变量操作-字符串

python对变量&#xff08;不同数据类型&#xff09;的操作 数字操作字符串操作列表操作元组操作集合操作字典操作Python3 中有六个标准的数据类型&#xff1a;Number&#xff08;数字&#xff09;、String&#xff08;字符串&#xff09;、List&#xff08;列表&#xff09;、T…

织梦自适应php源码,DEDE织梦PHP源码响应式建筑设计类网站织梦模板(自适应手机端)...

模板名称&#xff1a;响应式建筑设计类网站织梦模板(自适应移动端) 利于SEO优化模板详情&#xff1a;织梦最新内核开发的模板&#xff0c;该模板属于企业通用、HTML5响应式、建筑设计类企业使用&#xff0c;一款适用性很强的模板&#xff0c;基本可以适合各行业的企业网站&…

nyoj 题目5 Binary String Matching

Binary String Matching 时间限制&#xff1a;3000 ms | 内存限制&#xff1a;65535 KB难度&#xff1a;3描述Given two strings A and B, whose alphabet consist only ‘0’ and ‘1’. Your task is only to tell how many times does A appear as a substring of B? For…

php array =,PHP Array 函数

PHP Array 函数PHP Array 函数## PHP Array 简介PHP Array 函数允许您访问并操作数组。支持简单的数组和多维数组。## 安装PHP Array 函数是 PHP 核心的组成部分。无需安装即可使用这些函数。## PHP 5 Array 函数| 函数 | 描述 || ------------ | ------------ || array() | 创…

mac本用WTG(Windows To Go)安装Win10到移动硬盘

准备工作&#xff1a; 一个空的 USB 3.0 移动硬盘&#xff08;在安装 WTG 时候会将这个硬盘清空重新并分区&#xff0c;注意备份好数据。USB 3.0 的优盘是不行的&#xff0c;即使安装成功&#xff0c;系统的运行速度会奇慢&#xff09; 原版Windows 10 安装镜像&#xff08;建议…

mac编译安装php环境,在Mac上编译安装PHP7的开发环境

今天看到鸟哥发微博说php7 beta1测试版发布了&#xff0c;于是赶紧就去抢先下载&#xff0c;把自己的开发环境也升级到PHP7去&#xff0c;话不多少&#xff0c;下面就一起来搞起吧。。。首先你得去官网下载php7 beta1的版本这里由于我是在mac上安装&#xff0c;所以就去下载lin…

js初步简单的编程代码

简单图片切换编码demo图片地址自行替换 简单图片切换编码<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.org/1999/xhtml" …

AC自动机——Uva 11468 子串

题目链接&#xff1a;http://vjudge.net/contest/142513#problem/A 题意&#xff1a;给出一些字符和各自对应的选择概率,随机选择L次后将得到一个长度为L的随机字符串S.给出K个模版串,计算S不包含任何一个串的概率. 分析&#xff1a; 在构造好的AC自动机里面&#xff0c;每随机…

安卓文本编辑器php cpp,开源的Android富文本编辑器

RichEditor基于原生EditTextspan实现的Android富文本编辑器github地址&#xff1a;https://github.com/yuruiyin/RichEditor组件描述该组件是基于原生EditTextspan的方式实现的&#xff0c;旨在提供一个功能齐全且使用方便的Android富文本编辑器。主要支持了加粗斜体等行内样式…

java identifier expected,java – hibernate h2 embeddable list expected“identifier”

我试图将一个功能列表(Embeddable)关联到我的Employee Entity中,而H2似乎对这个说它期望一个“标识符”不满意Caused by: org.h2.jdbc.JdbcSQLException: Syntax error in SQL statement ”CREATE TABLE EMPLOYEE_FUNCTIONS (EMPLOYEE_EMPLOYEEID VARCHAR(255) NOT NULL,ACTIVE…

建行信用卡问题

技巧&#xff1a;一般不要打400的&#xff0c;如果有其他的固话如&#xff1a;021-38690588后按语音提示5挂失&#xff0c;点5后让输入密码&#xff0c;继续往下听&#xff0c;会提示如果遗忘密码请选择6个星*转接人工服务&#xff0c;转接后直接说明挂失等操作即可。 打021开头…

学生信息管理系统的价值PHP,php技术对学生管理系统实现的价值研究

基于php技术的学生管理系统的设计要解决的主要问题就是通过设计切实可行的管理系统来解决学校对学生信息的管理、老师对学生信息的管理、学生对自己信息的核对等问题。本系统是利用netbeans作为前台开发工具、利用phpstusy开发环境开发的&#xff0c;数据库采用MySQL&#xff0…

【FFMPEG】【ARM-Linux开发】 ffmpeg 静态库使用,undefined reference错误

原文&#xff1a;http://blog.csdn.net/chinazjn/article/details/7954984 ffmpeg移植到dm365上&#xff0c;遇到undefined reference错误&#xff1a; GA/gabin/lib/libavformat.a(allformats.o): In function av_register_all: /GA/ffmpeg-0.10/libavformat/allformats.c:53:…

php filespl,PHP SPL--遍历目录

1、PHP SPL标准库的用法(遍历目录,查找固定条件的文件)class RecursiveFileFilterIterator extends FilterIterator{// 满足条件的扩展名protected $ext array(jpg, gif);/*** 提供 $path 并生成对应的目录迭代器*/public function __construct($path){parent :: __construct(…

OpenCV 2 学习笔记(9): 定义ROI(regions of interest):给图像加入水印

http://blog.csdn.net/fred_yang2013/article/details/10175921转载于:https://www.cnblogs.com/eustoma/p/6104995.html

php 查询键名是否存在,PHP array_key_exists():检测键名是否位于数组中

PHP array_key_exists() 函数用来检查给定键名(或者索引)是否存在于数组中&#xff0c;语法如下&#xff1a;bool array_key_exists ( mixed $key , array $arr )参数说明&#xff1a;key 表示键名&#xff1b;arr 表示要被检索的数组。返回值&#xff1a;如果键名 key 存在于数…

学习笔记:MySQL字符串类型

字符串类型 a) char和varchar 1.都需要指定字符的长度&#xff0c;char中的长度是字符的长度&#xff0c;而varchar的长度是字节的长度 2. char中指定的长度就是实际占用的长度&#xff0c;而varchar指定的长度只是一个范围&#xff0c;所以varchar还要拿1-2个字节存储…