这种游戏,位置关系很简单死板。分两层或者三层就可以了。底层放文字背景。上层放Label
只要位置同步就好了。
比如说 要生成一个 汉字:抽 在 x:1,y:1上。那么bg放bgLayer, label 放 charLayer .移除同时移除。更新状态有索引就能更新啦。
亦或者。九宫格,charLayer就9个label,bgLayer 也就九个bg。整个 游戏的bg和char用一个二维数组保存。对应九宫格,数据改变了就刷新一下数据就ok啦
。或者哪个格子的数据改变了就更新哪个格子咯(MVVM的方式)
卧槽。。 那太复杂了吧。。。 而且太不优雅了。。。 改个设计 改个逻辑不烦死了么。。。
看起来好牛逼,新手表示非常有难度。。。 看不太懂。。。
有简单点儿的方案么。。
比如针对很特定的场景,一个prefab表示一个节点树,同prefab最多节点树层级个draw call?
直接在prefab上就设置合并draw call这种。。。
我之前玩的时候 label cache mode 记得是要打包之后才会生效的
分层不复杂(实际上只需要比正常情况多做一步而已),只是楼上实现的方法比较麻烦而已。
一般情况是,item统一用prefab,prefab又绑定个组件A,组件A是用来控制item里的逻辑。
多的一步是:在item初始化后,对item里的字节点进行分层操作(从item节点下移除并有规划的添加到其它节点(层),以达到降低dc却不影响显示效果)。
能动态的把这事儿做了么。。 比如在item的prefab上加一个额外的组件,填好label的节点,运行的时候,这个组件把所有的label节点搞到一层上。。。
我比较新手,我对你的话理解了下,你看对不:
在运行的时候,新建一个node,用于承载所有label节点。把item中的label移动到新建的这个node的上,作为它的子节点。
这样在渲染的时候,由于是一个node下的N多同层的label,可以合并draw call。
如果是的话,我今天晚上就研究下写一个这种组件~ 哈哈哈哈 成功的话 就放出来。。。
搞不定。。。 尝试用一个代理Node去代理含Label的Node,替换后的位置及之后的位置变化都没法做。。。
把word Node中的label Node替换成一个LabelProxyNode(图中没体现,继承自cc.Node)
步骤:
- new一个LabelProxyNode
- 设置LabelProxyNode持有label对象,设置y属性的getter、setter(没啥意思,因为滚动的时候用的是lineNode的y属性)
- 把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 | | | | | | |
| | | | +-------+ +------+ | | | | | |
| | | +----------------------+ +-------------------+ | | |
| | | | | |
| | | | | |
| | +-------------------------------------------------+ | |
| | | |
| | +-------------------------------------------------+ | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | +-------------------------------------------------+ | |
| | | |
| | +-------------------------------------------------+ | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| +--+-------------------------------------------------+---+ |
| |
| |
| |
+--------------------------------------------------------------+
真牛逼。。 非常感谢~~
我拿你的例子在手机上试了下,优化与否都不卡,始终是60fps,dc差距确实巨大。
所以,我那个例子卡,可能还是因为滚动实现用了每个节点y–导致的吧? 晚上尝试改成摄像机的方式。
还有两个疑问。。。
- 我看代码中对一个函数标记成async又在第一行await 0了。这个是说执行这个函数立马返回,不阻塞正常流程么?
- 同层处理的时候,并没有处理节点顺序,通过log输出,节点确实已经同类型排序了。。。ccc自己做的?
谢谢~~
我还发现,这个完全可以写一个非常通用的组件出来。。。。 官方竟然不提供。。。
1.写不写成这样,在这里都没什么影响…
2.因为在分层处理时设置了zIndex
了解了。。 多谢~~
这个还是需要自己优化一下结构
所以,就是把所有label放在一个节点下,所有sprite放在另一个节点下吗
效果不太行。 这个方法在电脑模拟器上有效。 到IOS实机上后,drawcall没有变化
bg和bg的节点层级关系要相邻,中间不要掺label会打断dc, bg应该是图集内的精灵帧, 文本可以试试改成char缓存模式,l应该会降低很多了
非常牛逼 简单明了 优雅