cocos creator 2.0.10制作成语游戏,drawcall太高

这种游戏,位置关系很简单死板。分两层或者三层就可以了。底层放文字背景。上层放Label
只要位置同步就好了。
比如说 要生成一个 汉字:抽 在 x:1,y:1上。那么bg放bgLayer, label 放 charLayer .移除同时移除。更新状态有索引就能更新啦。
亦或者。九宫格,charLayer就9个label,bgLayer 也就九个bg。整个 游戏的bg和char用一个二维数组保存。对应九宫格,数据改变了就刷新一下数据就ok啦
。或者哪个格子的数据改变了就更新哪个格子咯(MVVM的方式)

卧槽。。 那太复杂了吧。。。 而且太不优雅了。。。 改个设计 改个逻辑不烦死了么。。。 :sweat_smile:

可以试试这个
https://forum.cocos.com/t/ui/80026

虽然不能优化Label的drawcall,但是可以让同样的节点同层级ui批量渲染,而且还不用修改节点的层级关系。

看起来好牛逼,新手表示非常有难度。。。 看不太懂。。。
有简单点儿的方案么。。
比如针对很特定的场景,一个prefab表示一个节点树,同prefab最多节点树层级个draw call?
直接在prefab上就设置合并draw call这种。。。

我之前玩的时候 label cache mode 记得是要打包之后才会生效的

分层不复杂(实际上只需要比正常情况多做一步而已),只是楼上实现的方法比较麻烦而已。

一般情况是,item统一用prefab,prefab又绑定个组件A,组件A是用来控制item里的逻辑。

多的一步是:在item初始化后,对item里的字节点进行分层操作(从item节点下移除并有规划的添加到其它节点(层),以达到降低dc却不影响显示效果)。

能动态的把这事儿做了么。。 比如在item的prefab上加一个额外的组件,填好label的节点,运行的时候,这个组件把所有的label节点搞到一层上。。。 :grinning:

我比较新手,我对你的话理解了下,你看对不:
在运行的时候,新建一个node,用于承载所有label节点。把item中的label移动到新建的这个node的上,作为它的子节点。
这样在渲染的时候,由于是一个node下的N多同层的label,可以合并draw call。

如果是的话,我今天晚上就研究下写一个这种组件~ 哈哈哈哈 成功的话 就放出来。。。

搞不定。。。 尝试用一个代理Node去代理含Label的Node,替换后的位置及之后的位置变化都没法做。。。
:disappointed_relieved:

把word Node中的label Node替换成一个LabelProxyNode(图中没体现,继承自cc.Node)
步骤:

  1. new一个LabelProxyNode
  2. 设置LabelProxyNode持有label对象,设置y属性的getter、setter(没啥意思,因为滚动的时候用的是lineNode的y属性)
  3. 把LabelProxyNode的父节点设置成label的父节点(word Node),把label的父节点设置为proxyNode(这个名字不太达意,就是存储labelNode的一个Node)

然后,wordNode是通过prefab创建出来的,脚本中明确声明了一个cc.Label Node,通过编辑器直接就把labelNode赋值了。
后续运行的时候,直接替换wordNode的child无法替换脚本中的引用(好像不替换更好。。。 )
wordNode相对于LineNode的位置是固定的,LineNode相对于flowFrameNode y轴是递减的。。。。。

所以,目前的问题就是,虽说我替换了,但是,labelNode并没有跟着滚动(位置无法处理)

              示意图               
         +--------------------------+Main Node+-------------------------+
         |                                                              |
         |  +----------+proxy Node contain all Label Node------------+  |
         |  | +-------+ +-------+ +-------+                          |  |
    +---------> label | |       | |       |                          |  |
    |    |  | +-------+ +-------+ +-------+                          |  |
    |    |  +--------------------------------------------------------+  |
    |    |  +-----------------------+flow frame+---------------------+  |
exchange |  |                                                        |  |
    |    |  |  +------------line contain 2 word Node-------------+   |  |
    |    |  |  |                                                 |   |  |
    |    |  |  | +-----+word Node-------+ +-------------------+  |   |  |
    |    |  |  | |  +-------+  +------+ | |                   |  |   |  |
    +---------------+ label |  |  bg  | | |                   |  |   |  |
         |  |  | |  +-------+  +------+ | |                   |  |   |  |
         |  |  | +----------------------+ +-------------------+  |   |  |
         |  |  |                                                 |   |  |
         |  |  |                                                 |   |  |
         |  |  +-------------------------------------------------+   |  |
         |  |                                                        |  |
         |  |  +-------------------------------------------------+   |  |
         |  |  |                                                 |   |  |
         |  |  |                                                 |   |  |
         |  |  |                                                 |   |  |
         |  |  |                                                 |   |  |
         |  |  |                                                 |   |  |
         |  |  |                                                 |   |  |
         |  |  |                                                 |   |  |
         |  |  +-------------------------------------------------+   |  |
         |  |                                                        |  |
         |  |  +-------------------------------------------------+   |  |
         |  |  |                                                 |   |  |
         |  |  |                                                 |   |  |
         |  |  |                                                 |   |  |
         |  |  |                                                 |   |  |
         |  |  |                                                 |   |  |
         |  |  |                                                 |   |  |
         |  +--+-------------------------------------------------+---+  |
         |                                                              |
         |                                                              |
         |                                                              |
         +--------------------------------------------------------------+

临时写了个分层demo,scrollview(100+item),分层后 5dc。hierarchy_demo.zip (631.2 KB)

1赞

真牛逼。。 非常感谢~~ :+1:

我拿你的例子在手机上试了下,优化与否都不卡,始终是60fps,dc差距确实巨大。
所以,我那个例子卡,可能还是因为滚动实现用了每个节点y–导致的吧? 晚上尝试改成摄像机的方式。

还有两个疑问。。。

  1. 我看代码中对一个函数标记成async又在第一行await 0了。这个是说执行这个函数立马返回,不阻塞正常流程么?
  2. 同层处理的时候,并没有处理节点顺序,通过log输出,节点确实已经同类型排序了。。。ccc自己做的?

谢谢~~

我还发现,这个完全可以写一个非常通用的组件出来。。。。 官方竟然不提供。。。

1.写不写成这样,在这里都没什么影响…
2.因为在分层处理时设置了zIndex

了解了。。 多谢~~ :+1:

这个还是需要自己优化一下结构

所以,就是把所有label放在一个节点下,所有sprite放在另一个节点下吗

放在同一个节点下也行。。 你可以看下我根据大神的思路写的那个通用组件。。 配置几下就行了。。 https://forum.cocos.com/t/draw-call/80902

:+1:

效果不太行。 这个方法在电脑模拟器上有效。 到IOS实机上后,drawcall没有变化

bg和bg的节点层级关系要相邻,中间不要掺label会打断dc, bg应该是图集内的精灵帧, 文本可以试试改成char缓存模式,l应该会降低很多了

非常牛逼 简单明了 优雅