想问下label字体合批的规则是什么样的。我看了下 2D 渲染组件合批规则说明以及label的cache模式。
描述下我现在的情况,字体都是在节点树中排列在一起的,使用的缓存模式都是char,字体颜色甚至文本都是一致,每个文本都使用了labeloutline和labelshadow。但是渲染的drawocall特别高,我在浏览器通过Spector逐帧分析,发现字体在渲染的时候并没有达到默认的合批最大4096个顶点数,每帧有时候渲染几十个顶点,有个渲染十几个顶点,想请教下是为什么,谢谢
这是调试截图
1建议看这个文章 【乐府】突破Label的缓存模式(2)-CHAR的无限模式
2char模式我没研究过 但是之前参考 【乐府】突破Label的缓存模式之(1) BITMAP 研究过bitmap模式,char模式我估计是类似的,只是将单个字符作为一个对象合入图集中。
bitmap是雕版印刷,char是活字印刷。
3无论是bitmap还是char,既然是做缓存,那么一定是用动态合图的方式合入图集了。我怀疑你这里是图集空间用光了。具体优化请自己看 1 吧
这个参考价值不大,可以试试弄多一点,当顶点个数超出默认4096后,合批就变成迷了,你可以试试
量大了之后,处在不同图集里,相邻渲染次序相同图集会合批,不同图集不合批,这时drawcall会混乱起来。
谢谢分享方案,但是这个可能与我当下的问题不太符合。
1.目前我使用的是char模式,按照官方文档理解,char出问题也是字符渲染不出。目前我的情况是字符都渲染出来了,而且都是战斗飘字,都是数字和±,符号,不至于会导致分配占满了。而且使用的数字都是-1
2.主要是想知道引擎底层就是这样还是我使用不当,如果是引擎底层就这样可能才会使用其他方案来处理字体合批
铁子,现在的问题是通过渲染调试发现每帧并没有达到这个值对应的4096顶点
不知道这个值是怎么计算出来的,实测是这样,大概只有1000多吧
官方文档包括源码也说明这个144指向了4096,就算1000也能接受,你看我的帧调试截图,有时候一帧只有十几个二十几个顶点,感觉不在可控范围内
盲猜跟文本长度相关,可能实现的时候是按一个一个字拼的去提交,这个版本给我是这个感觉
应该不会,我的文本内容几乎全都是-1,一个字符四个顶点,难顶
我实测了下还真是 一个文字6个顶点
改成bitmap就好了,char是会把字拆成一个个的
好的吧,原来一直是这样,只是没关注这块
可能不行,我这个是战斗数字,个数,变化量非常大,我之前使用bitmap的时候在cpu里生成图片的消耗非常大
那用位图字体就好了,就是让美术把数字做成图片
这个方案倒是可以尝试,代价也不大
发个demo瞧瞧把