许彦峰
V1
2023/05/18阅读:6主题:橙心
cocos2dx合批方案比较
需求
在讨论这个问题,有一个前提,label的节点关系是前后相挨,没有其他类型节点穿插其中
-
label1 -
label2 -
label3 -
...
cocos2dx的label无法合批,一个label一个drawcall。
现在需要支持label能够合并为一个drawcall,并希望支持后续的图文合批功能。
方案对比
方案 | 描边效果 | 字符纹理 | 优点 | 缺点 |
---|---|---|---|---|
字符纹理携带颜色相关信息实现描边 cocos creator |
扩边算法![]() |
顶点数据里面的颜色属性影响字符纹理![]() |
* 支持图文合批 * 渲染一个字符只有2个三角形4个顶点 * 描边效果非常好,支持描粗边 |
* 因为携带颜色信息会产生大量字号相同但颜色不同的相似字符纹理 * 字符纹理是在CPU端计算生成,cocos2dx是在shader完成,需要保证效果统一 * 纹理格式使用的是RGBA,一个像素点需要4字节存储 |
通过字符纹理叠加实现描边 unity |
不同颜色的字符纹理叠加 ![]() |
顶点数据里面的颜色属性会影响渲染效果![]() |
* 支持图文合批 * 字符纹理不携带颜色信息,不会产生大量冗余的字符纹理 纹理格式使用的是A8,一个像素点需要1字节存储 |
* 拐角处描边缺失![]() ![]() * 渲染一个字符需要5*2个三角形,5*4个顶点 |
合批前提是大家都在一个纹理
cocos2dx对于描边纹理使用的是AI88,使用2个通道存储
vertex format
在一个批次里面绘制不同描边颜色的文本,颜色信息不能放在uniform里面,会导致所有文本的描边都是同色,因为uniform是共享的。
只能把描边颜色信息放在顶点里面,顶点里面只有position、texture coord、color,这里的color是node.color,不是label.color,没有合适的字段传递描边颜色,只能扩展顶点格式,增加outlineColor字段,也就是支持vertex format
vertext format会导致sprite和label的顶点格式不一致,导致无法合批,无法满足图文合批的需求。
作者介绍
许彦峰
V1