【组件】降低Draw Call组件 新增完整实例演示

你看看本文上边ascii的原理图~ 把设置的一些节点移动到同节点下进行有序排列。。 我都没用过Graphics。。。 无法回答你的问题。。。

大神,我哪里设置不对吗?Drawcall没降

组件升级支持多个根节点了。 然后, 待节点路径要写完整的路径了。 这个例子应该写

  • flowLine/word/bg
  • flowLine/word/word label

github上的demo更新了~

节点父物体改变,wdige的锚点适配就乱了。。如果是那种同比缩放的适配估计还好

Mark!!

对,这些问题得自行考虑。。 比如父节点destroy了,子节点也要同时处理掉。。。 我现在在想通用的解决方案。。 其实es6支持Proxy类,但是现在用不了。。 typescript中都没支持它。。。

要是这些问题都能解决了,那这个组件算是成熟了 哈哈

想得美。。。 我用了一天时间 终于解决了一个无限文字流点击的小场景。。。
总结下来其实不复杂:

  1. 需要优化子节点的节点,需要把子节点用属性引用的方式一只持有被优化节点的对象句柄
export default class Word extends cc.Component {

    @property(cc.Sprite)
    bg: cc.Sprite = null

    @property(cc.Label)
    label: cc.Label = null
  1. 节点在销毁或重用时,需要对被优化节点做处理(销毁同步销毁,重用把子节点先拿回来,设定好位置等,再优化一遍)
// 被优化节点的父节点用对象池的情况
export default class Word extends cc.Component {

    unuse() {
        this.label.enabled = false
        this.bg.enabled = false
        this.correct = false
        // 拿回来,确定位置,再执行优化(外层添加新节点的时候会执行一次优化) 
        this.label.node.parent = this.node
        this.bg.node.parent = this.node
        this.label.node.position = cc.Vec2.ZERO
        this.bg.node.position = cc.Vec2.ZERO
    }

    reuse() {
        // draw call优化后,导致节点分离,要重置下状态
        this.label.enabled = true
        this.bg.enabled = true
    }
}

关于对象复用的时候,计算子节点位置的时候,我纠结了半天,如果直接算,会出很多时序上的问题,很坑。
所以,用这种直接拿回来的方式,再好不过了~

大家的项目draw call一般是跑到多少?我这边普通的安卓机50多draw call感觉有点卡顿

Frame time(ms) 10.2
Framerate (FPS) 58~60
Draw call 58
Game Logic(ms) 0.5
Renderer(ms) 9.7

这样正常吗?在微信小游戏普通安卓机,老感觉runAction会有点卡顿,特别是spine动画+action

draw call 14 ios还能感觉到卡顿呢。。 卡不卡不一定是draw call引起的。。。我今天碰到的问题是对象池内节点回收没清理绑定的监听操作。用各种方法都没查到原因,还是点击后有多条log发现的。。。

记得以前有一个牛逼的贴子是教怎么查看性能瓶颈的。。。可以论坛里搜一下~

mark

双击666

多谢分享

这个实际运用还是比较局限的吧,某些情况下用还不错

好的谢谢,我找找看

按我理解,如果需要把相同的node抽出来做合批,那用这个就合适。没必要再写一遍。所以,我做成了通用组件。
无论用这个组件做抽离或者自行抽离,都要自行处理抽出来节点跟原父节点之间的联系。。避免不了~

mark

mark

mack