Egret使用心得

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

你可能感兴趣的:(egret)