EgretH5游戏开发笔记(一)

些容易导致掉帧的原因

  1. 矢量图(图形)
    不要用矢量图,点击区域可用空的组件替代,遮罩的bar用位图替代
    比如fgui不要用图片装载器画一个图.

  2. 遮罩
    尽量少的用遮罩,有些《静态》地方没办法必须要用遮罩的(比如头像要切成六边形),必须cacheAsBitmap尽量少的用遮罩,有些《静态》地方没办法必须要用遮罩的(比如头像要切成六边形),必须cacheAsBitmap

  3. 组件元素太多(在列表元素体现比较明显)
    组件中不要刻意追求文件小而把图片切的很细,直接做成一张图切九宫就好

  4. 显卡压力

    1. 滤镜的使用,每使用一个滤镜,就要多一个drawcall,一个带文字滤镜的文本按钮,占3个draw。尽量少用滤镜,尤其是在列表元素中,一些程序数字要带滤镜的,让美术做成图片字,这样效率比较高
    2. 按钮没有置灰态,而用系统自带的滤镜置灰(迭代置灰,影响drawcall很大)。按钮加上置灰态的控制器选项,并用显示控制做一下置灰态。
    3. 图集穿插太频繁,渲染一个文件的时候,重复上传同一个图集到GPU上,导致drawcall上涨。组件尽量做扁平化,尽量同一图集的元素一起绘制,降低图集穿插导致drawcall升高,尤其是列表元素,更要注意
    4. 同一像素坐标上的元素越多,越耗显卡。尽量用扁平化显示层级,同一像素上叠加的元素要尽量少
  5. cpu太高

    1. 某一时刻代码无必要的执行导致那一时刻很卡(MsgFieldsUpdate会导致主界面头像框重新编制、主界面上各种监听按钮重新设置控制器。表的首次解析等非常严重掉帧)
    2. (个例)引用了鼠标库,但是在手游地址没有将鼠标库禁用,导致手机上每帧执行显示对象的hitTest,CPU超高占用,掉帧严重
    3. GC太频繁(用好对象池,比如CallBackVO,不要随手一个new)
    4. 界面中尽量重用元素,比如有一个item里有多个图标,以“一个图标在不同控制器下显示不同位置”来代替“放两个图标,通过控制器控制显示哪个”,这样能加快初始化速度
  6. 内存泄露常犯

    1. 一个复杂组件(如BonusIcon),它里面有很多个元素,但是同一时间只显示一个元素(比如有CommonItemIcon和PetIcon,同一时间只会显示CommonItemIcon或PetIcon),这时调用dispose,不会调用不显示组件的dispose,需要手动调用(比如这边的PetIcon)1. 一个复杂组件(如BonusIcon),它里面有很多个元素,但是同一时间只显示一个元素(比如有CommonItemIcon和PetIcon,同一时间只会显示CommonItemIcon或PetIcon),这时调用dispose,不会调用不显示组件的dispose,需要手动调用(比如这边的PetIcon)
    2. Dictionary里面删除一项的时候,只调用了delete方法,没有先取出来dispose
    3. static方法里面new出来的东西如果没有管理,就会GCROOT,不能释放。应该要用对象池等方式来创建对象。
    4. 事件没移除
    5. fairygui.UIPackage.createObject出来的对象,一定要看一下是否在添加它的组件里dispose的时候,它会被dispose,不然要手动dispose(这里有一个特殊情况,刚开始做的时候是有手动调用createObject出来对象的dispose,但是由于重构,不要这个createObject出来的对象了,忘记把createObject这行删掉,但是dispose删掉了,导致内存泄露)
    6. 区分好MVC各模块的职责,Data.ts里面就好好放data,不要出现显示对象,因为Data里面的dispose很暴力,词典直接dic = null或dic = {},如果dic是createObject出来的显示对象,直接导致大片内存泄露(h5_hero中的tipItemDic就存在这个问题)。词典如果是显示对象,要先取出来dispose,再设空
    7. egret.Timer只调用了移除onTimer事件,但是并没有stop,导致一直在后台跑
    8. TipMgr.addTip和TipMgr.removeTip所传的目标不一致,导致内存泄露(游戏中非常普遍存在)

你可能感兴趣的:(Egret学习笔记)