许彦峰

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