1.示例的批次为3是正常的
这里的三次绘制分别是:**1.**头像底框 **2.**BMFont文本 **3.**Profile信息。因为文本绘制的时候BlendFunc是用的SRC_ALPHA, 头像框用的是ONE,两次绘制的Blend State不一致。如果想要合批,你需要修改一下文本使用的材质里effect记录的BlendFunc为ONE,或者修改图片的Blend为SRC_ALPHA。文本的BlendFunc修改代码参考如下:
let material = this.label.sharedMaterials[0]
let passes = material._effect.getDefaultTechnique().passes;
for (let j = 0; j < passes.length; j++) {
let pass = passes[j];
pass.setBlend(
true,
cc.gfx.BLEND_FUNC_ADD,
cc.gfx.BLEND_ONE, cc.gfx.BLEND_ONE_MINUS_SRC_ALPHA,
cc.gfx.BLEND_FUNC_ADD,
cc.gfx.BLEND_ONE, cc.gfx.BLEND_ONE_MINUS_SRC_ALPHA
);
}
material.setDirty(true);
2. 动态合图的说明
这里你的图集尺寸是19211734,BMFont尺寸是258464,如果不使用AutoAtlas合图,引擎的动态图集尺寸最大是2048*2048,可合并的碎图限制的最大尺寸是512。并且需要保证图片的预乘,Wrap, Filter等信息与动态图集一致才能够动态合批。
3. 引擎层面的修改
目前引擎层面的BMFont在满足动态合图需求时没有再次进行动态合图,比如你示例中,如果不使用AutoAtlas, 文本节点“1234”,后面再添加一个使用BITMAP模式的系统文本节点,drawcall还会是4,这种情况引擎层面做了修改,可以参考:
https://github.com/cocos-creator/engine/pull/5196
修改之后,BMFont可以跟使用BITMAP模式的系统文本及其他满足需求的碎图进行动态合图。(注意:示例中的BMFont图片需要取消预乘选项的勾选,保证Texture的参数一致)