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)非动作游戏降低帧率可大幅提高性能。

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Idea实现WebService实例

    Idea实现WebService实例因为工作需要,数据传输部分需要使用webservice实现,经过两天的研究,实现了一个简单的例子,具体方法如下。首先需要新建一个项目,如图:下一步点击finish,然后会生成一个webservice项目,在HelloWorld类里面写自己的方法,在file下编译一下这个类,不编译,idea会提示不通过,编译后需要将为该服务发布WSDL文件,此文件必须生成,如下图:选择需要发

    2022年7月21日
    70
  • matlab解常微分方程组数值解法(二元常微分方程组的解法)

    上篇博客介绍了Matlab求解常微分方程组解析解的方法:博客地址微分方程组复杂时,无法求出解析解时,就需要求其数值解,这里来介绍。以下内容按照Matlab官方文档提供的方程来展开(提议多看官方文档)介绍一下核心函数ode45()一般形式:[t,y]=ode45(odefun,tspan,y0) 其中tspan=[t0tf]功能介绍:求微分方程组y′=f(t,y)从t0…

    2022年4月18日
    655
  • pmf文件「建议收藏」

    pmf文件「建议收藏」1、首先是视频软件,其次还是DISKGENI(磁盘分区软件),当作镜像文件恢复文件到磁盘(类似ISO)。2、PMF文件为主要与primarilyPegasusMailMessageAttachment(DavidHarris)相关联的GIS文件。PMF文件还与以下相关联:PayrollMate2008(RealTaxTools.com),PCLToolPageTechM…

    2022年6月18日
    73
  • java GC算法「建议收藏」

    java GC算法「建议收藏」一般来说,程序使用内存的方式遵循先向操作系统申请一块内存,使用内存,使用完毕之后释放内存归还给操作系统。然而在传统的C/C++等要求显式释放内存的编程语言中,记得在合适的时候释放内存是一个很有难度的工作,因此Java等编程语言都提供了基于垃圾回收算法的内存管理机制:垃圾内存回收算法常见的垃圾回收算法有引用计数法(ReferenceCounting)、标注并清理(MarkandSweep…

    2022年6月17日
    28
  • codeif idea_ps插件安装在什么位置

    codeif idea_ps插件安装在什么位置1、点击File->Settings->Plugins->设置->InstallPluginfromDisk2、选中MappingSearch.jar3、重启IDEA,在Help菜单下有个“MappingSearch映射搜索”选项表示安装成功此后就可以使用插件的变量名搜索功能,右键CodeIf,则会弹出许多适合的变量名。以后就不用头秃的想变量名问题了。附上jar包下载地址:https://download.csdn.net/download/qq_44752641/1

    2022年9月21日
    2
  • gitlab cicd配置

    gitlab cicd配置简介以前代码更新之后,我们需要手动将代码拉到测试服务器上,运行验收通过之后,再在生产环境重新弄一遍,一两个服务还算轻松,如果涉及到的服务很多的话,每一个服务都需要这样来几遍,这是一个很头疼了,为了解决这个问题,我们引入了比较简单易懂的自动化部署工具,这也是gitlab自带的CI工具gitlab-runner,该工具解决了多环境多服务手动部署繁琐问题,用自动化脚本代替人工部署,我们不需要手…

    2022年6月9日
    85

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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