Egret使用心得

Egret使用心得转自:https://www.indienova.com/u/monkeybean/blogread/2188一、曾用工具介绍EgretEngine,个人使用引擎版本从1.7.3到3.1.4。Egret配套工具:1.界面排布及部分属性预设—EgretWing2.碎图压缩合成大图及MovieClip动画素材处理—TextureMerger3.资源管理—Re

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

转自:https://www.indienova.com/u/monkeybean/blogread/2188


一、曾用工具介绍

Egret Engine,个人使用引擎版本从1.7.3到3.1.4。

Egret配套工具:

1.界面排布及部分属性预设—Egret Wing

2.碎图压缩合成大图及MovieClip动画素材处理—TextureMerger

3.资源管理—ResDepot

4.chrome下调试插件—Egret Inspector

5.粒子效果制作—EgretFeather

6.项目管理及代码编辑,IDE—Webstrom,文本编辑器—sublime

7.流程图等UML图制作—Visio

8.版本控制,svn及git在不同项目中均用过

9.在线图片压缩—tingPng.com

10.远程登录及管理文件—Winscp、Xshell、secureCRT

11.项目协作—teambition

12.图片处理及格式转换—PhotoShop及格式工厂

13.数据统计—dataEye、talkingData、友盟

14.来路不明的合图抠图—pngSplit

15.Json转换如Excel数据转为Json—http://www.bejson.com/,策划数据与开发对接使用

16.二维码生成—cli.im

二、开发常用代码及参数说明
1.index.html中,data-entry-class = “Main”,进入游戏访问的第一个Ts文件,入口类;data-orientation=”auto”,旋转方向设置;data-frame-rate = “60”,游戏帧率设置,可更改,建议为60的约数,正式项目基本设置为60,测试时更改。data-show-fps=”false”,默认为false,开启后可看到实时帧率,测试使用;data-show-log = “false”,默认为false,开启后,代码中egret.log()中的内容即显示在屏幕中,测试使用。

2.开启fps后的参数说明。FPS为帧率;Draw为每帧draw方法调用的平均次数,脏矩阵占舞台的百分比;Cost为每帧舞台所有事件处理及矩阵运算耗时,绘制显示对象耗时(单位为ms)。

3.是否已进行新手引导等数据可存储在本地浏览器中,如LocalStorage.setItem(“new_guide”,”done”)。

4.延时及计时器,如下:

var key:number = egret.setTimeout(function(){

      //执行事件

      egret.clearTimeout(key);

},this,500);  

类似的还有egret.setInterval();注意执行完毕的clear。

计时器如下:

class Heart
{

     public timer:egret.Timer;

     public constructor()

     {

          this.timer = new egret.Timer(100);
          this.timer.addEventListener(egret.TimerEvent.TIMER, this.onTimer, this);

          this.timer.start();

      }

      private onTimer(e:egret.TimerEvent):void
      {

      }
}

5.对象包含属性较多,采用Object类型,如public Obj_operate:Object = {};

6.动画基本操作,egret.Tween.get(this.m_UI.img_boat,{ loop:true}).to({y:384},2200).to({y:375},2200);

另外,call,pause, wait, remove, removeAll等参考API。

7.重定向设置window.location.href;在新窗口打开,window.open(“链接地址”,’newwindow’,’height=400,width=400,top=100,left=100′);

8.console.log(),console.warn(),console.error(),调试时区分控制台显示。

9.播放游戏特效代码,以下采用的是MovieClip

class Bomb extends egret.Sprite
{

     private mcf:egret.MovieClipDataFactory;
     private mc:egret.MovieClip;
     public constructor()
     {

         super();
         this.init();
     }
     public init(str1:string,str2:string,number:number):void
     {

         var data = RES.getRes(str1);
         var tex = RES.getRes(str2);
         this.mcf = new egret.MovieClipDataFactory(data, tex);
         this.mc = new egret.MovieClip();
         this.mc.movieClipData = this.mcf.generateMovieClipData();
         this.mc.play(number); //playTimes:number — 播放次数。 参数为整数,可选参数,>=1:设定播放次数,<0:循环播放,默认值 0:不改变播          放次数(MovieClip初始播放次数设置为1),
         this.addChild(this.mc);
         this.mc.addEventListener(egret.Event.COMPLETE, this.removeBomb, this);
     }
     //轰炸完毕
     private removeBomb(evt:egret.Event):void
     {

          if(this.parent!=null)
          {

               this.parent.removeChild(this);
           }
      }

}

10.在游戏开发过程中,由于Egret声音有问题,后期游戏选择引入第三方插件,WebAudio。webAudio及使用方法,个人百度网盘下载地址:http://pan.baidu.com/s/1o7F1Z30

11.Egret 3.1.2可设置输入文本样式,支持三种输入样式即普通文本(默认),密码和电话号。代码演示如下:

    var text :egret:TextField = new egret.TextField();

    //设置输入文本

    text.Type = egret.TextFieldType.INPUT;

    //设置输入类型为TEXT,还可设置为密码(PASSWARD),或电话号(TEL)

    text..inputType = egret.TextFieldType.TEXT;

    text.text = “输入文本”;

    text.width = 300;

    this.addChild(text);

三、性能优化

1.Audio

(1)如果需求中需要同时播放多个音频,则使用WebAudio。X5浏览器内核WebAudio可支持多音频。Egret3.1.4之后,index.html文件中,egret.runEgret({renderMode:”webgl”,audioType:0}); 默认的渲染模式为Canvas,之前微信平台上的游戏使用的均为Canvas。音频类型中,默认为0,IOS7以上表示WebAudio;1表示QQ Audio,项目若在腾讯平台上线如QQ空间中的玩吧,则使用QQ Audio,腾讯解析音频有自己的一套方案;2表示强制使用WebAudio;3表示使用浏览器自带的Audio,不推荐。

(2)当多个音频轮询播放播放的时候,如ababa,如果打开网络侦听,有可能发现播放一次向服务器请求一次,原因是不同浏览器内核对音频实现方式不一样。解决方案是:将轮询播放的多个音频拼成一个音频,通过时间段控制播放。

(3)由于浏览器的安全限制,加载完成可能无法自动播放背景音乐,这种情况将背景音乐设置成点击播放的形式,如加载完成后,弹出按钮,玩家点击选择是否播放背景音乐。主流H5游戏均是采用这种方式。

2.Text

(1)文本输入过程中,不要改变Canvas大小,如屏幕大小更改(横竖屏切换)。

(2)TextField中使用cacheAsBitmap,可以减少重绘次数。原因是TextField是文本,浏览器渲染通过CPU的计算,对图片渲染速度快,对文本渲染速度慢。

(3)TextField减少对于描边(stroke)的使用,用图片代替。

(4)输入文本框尽量出现在软键盘的上面,手机部分浏览器中,如果输入文本框太靠下,弹出的软键盘会遮挡住输入文本框。

3.Image

(1)单张图(包括SpriteSheet)的大小不要超过1024*1024,浏览器对图片大小限制会对超过的该尺寸大小的图片进行自动压缩处理导致图片模糊发虚。

(2)将碎图合成一张大图,每次进行图片下载时会先进行TCP三次握手协议,这个时间会超过较多小图下载的时间。

(3)使用九宫格时,不要使用非整数宽高;在List控件中不要使用九宫格图片来减少draw的次数。

(4)单静态页面,cacheAsBitMap可以减少重绘次数。如在大图中取出部分碎图组成的单静态页面。

(5)使用SpriteSheet合并的图片尺寸要优于单张图片的总尺寸,尤其是带透明通道的。

4.NetWork

(1)素材处理。不要一次性下载太多的素材,尽量分布在使用前加载。将碎图和成一张大图,减少下载次数。Png图可以使用压缩工具(如TinyPng)压缩减少体积。

(2)配置文件。尽量将配置文件合并到一个大文件里,减少下载次数。在Http请求中,加载单个文件速度要优于加载多个文件。配置文件去掉格式化,利用在线Json格式化工具(如bejson,sojson)处理Json数据。Json数据可以去掉一些不必要的小数和冗长命名。

(3)下载处理。资源服务器开启GZIP压缩,提高载入速率;登录加主页面素材不要超过2M;加入静默加载,比如在登录界面操作时下载主页面相关素材。

5.Mask

(1)遮罩如果是DisplayObject,必须加入到显示列表后,方能正常使用。

(2)遮罩如果是Rectangle,修改遮罩数据后,重新将遮罩赋值给对象。

6.DisplayObject

(1)Shape/DisplayObjectContainer,能通过父层计算出来的交互不直接在子容器里加。如EUI中,Group组件中有Image组件,Touch Image的监听直接将Touch监听加在Group上,如果是一个Group中有多张图需要有监听事件,可在Group上加一个监听,根据Group的Touch位置进行响应。

(2)禁用不必要显示对象的触摸交互,默认就是关闭的。但是开发时,自己的写的底层框架可能又给打开了,eui的touchenable是默认打开的,不需要touch事件监听时需手动关闭。触摸屏幕实际上就是触摸canvas,canvas根据位置在显示列表中逐层搜索,实际上也是碰撞检测。

   var sp :egret.Sprite = new egret.Sprite();

   this.addChild(sp);

   sp.touchChildren = false; //确定子孙对象是否接受触摸事件,默认为true

   sp.touchEnabled = false; //此对象是否接受触摸事件,默认为true

(3)能用图片的不用Graphics实现。

(4)尽量将静态图或者文字放到一个容器中,并对容器缓存(cacheAsBitMap)。

(5)减少显示对象的旋转缩放。

(6)尽可能重用对象,建立对象池,而不创建对象并对其执行垃圾回收。创建对象时,将对象创建在循环外部并在循环内反复重用。需要密集的创建对象,要引入对象池,例如做一款打飞机类型的游戏,进入战斗前,飞机,怪物,掉血特效等对象提前初始化,在过程中实时提取,而不是实时创建。

7.对象复用与释放

(1)Event派发要合理使用Event自带的静态方法,如egret.Event.dispatchEvent(this,”dragonbones”)。

(2)事件删除,用完事件即删除。

(3)Tween循环结束时,删除。

(4)显示列表删除,面板不使用则remove掉。

(5)回调删除,很多删除是在回调函数内完成的。

(6)显示停止计时器,让它们准备好进行垃圾回收。暂停清除计数器clearInterval()、clearTimeout()、Timer.stop()。

(7)删除对象的所有引用确保被垃圾回收器回收。

(8)删除资源RES.destroyRes(“”)。

8.TypeScipt

(1)尽量不要在使用方法内创建函数,一个函数内不要嵌套另一个函数的定义。

(2)Ts中没有super属性的调用,Js类继承的本质是通过原型链实现的,但是egret提供了egret.superGet 和 egret.superSet 来调用父类属性。

(3)类方法中,将this赋值给另一个临时变量self,var self = this;如果当前类this使用较多,如for循环内使用时,使用self。

(4)不要使用特殊的正则表达式,过于复杂可能会出现识别出错。

(5)不要在声明的时候初始化对象,需要赋值基本类型。可选择使用前初始化。

9.其他

(1)LocalToGlobal后的坐标不要有小数;一般情况下坐标计算等也尽量不使用小数。

(2)对象复用比较高时,如打飞机的子弹,使用对象池优化。

(3)尽量减少Alpha混合的使用。

(4)多次调用类属性时,避免直接使用this,如果for循环一直用到this.a,可var _a = this.a,用变量做简单缓存再去计算,效率就会提升,如_length = Array.length。

(5)Event.ENTER_FRAME数量控制。MainLoop包括ENTER_FRAME(每帧主要执行逻辑)->CLEAR(清空上一帧图像) ->UPDATE TRANSFORM(计算这一帧的显示) -> UPDATE DRAW。

(6)位移如跑酷游戏的计算不要通过帧数来计算,通过时间来计算。

(7)使用60的约数作为帧频数。Egret自带Timer,每秒固定振荡60次。

(8)对于简单的动画,使用序列帧或者db的急速模式。

(9)非动作游戏降低帧率可大幅提高性能。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/214283.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 《图解HTTP》读书笔记建议收藏

    《图解HTTP》对HTTP协议进行了全面系统的介绍。作者由HTTP协议的发展历史娓娓道来,严谨细致地剖析了HTTP协议的结构,列举诸多常见通信场景及实战案例,最后延伸到Web安全、最新技术动向等方面。

    2021年12月18日
  • 2021年最新idea激活注册码破解方法

    2021年最新idea激活注册码破解方法,https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • mysql安装包5.7.17.0_mysql-5.7.17-winx64压缩版的安装包下载和安装配置「建议收藏」

    mysql安装包5.7.17.0_mysql-5.7.17-winx64压缩版的安装包下载和安装配置「建议收藏」网上有很多的安装配置步骤,但是一个跟一个遇到的问题不一样,总之越是写的完整的人,遇到的错误越多,在安装过程中也就越悲催!第一步:下载mysql安装包—下载网址https://downloads.mysql.com/archives/community/第二步:找到你下载的文件夹,解压。然后你在任意一个磁盘内新建一个文件夹把它放好,这个文件夹就作为它的安装目录,我建的是这个路径—->F…

  • jdbc sql拼接字符串[通俗易懂]

    jdbc sql拼接字符串[通俗易懂]Listlist=this.getJtN().queryForList( "selectcpdmdm,cpmcmcfromt_cpxxwhere zt_dm=’1’andcpdmin("+cp_dm+")orderbydm");这样写是错误的,‘’单引号表示字符串,“”双引号表示字符串拼接,所以应改为"selectcpdmdm,cpmcmcfro…

  • 字典树详解「建议收藏」

    字典树详解「建议收藏」字典树字典树(又叫单词查找树、TrieTree),是一种树形结构,典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串)。主要思想是利用字符串的公共前缀来节约存储空间。很好地利用了串的公共前缀,节约了存储空间。字典树主要包含两种操作,插入和查找 是一种哈希树的变种,常用于,统计,排序,保存大量字符串(但不仅限于字符串),主要实现方法是利用串的公共前缀来减少查询时间,减少了不必要的比较,不仅…

  • hashtable与hashmap的区别_*p++和(*p)++的区别

    hashtable与hashmap的区别_*p++和(*p)++的区别一、HashMap简介   HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长。    HashMap是非线程安全的,只是用于单线程环境下,多线程环境下可以采用concurrent并发包下的concurrentHashMap。    HashMap 实现了Serializable接

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号