60 RMB 有偿求助,为什么 ~ 位图字体合并渲染~ 没有效果(2.1.2), 此题关闭,解决方案如下

提供下简单demo,我们会帮忙排查下~

你居然所有图都弄成一个图集。。

~~我已经拆开了。。。。

合并后未能减少 drawcall,是因为你的渲染顺序被打断了。
这种情况下,引擎会尝试动态合批,不过如果图片太大,默认限制是不能超过 512,引擎会放弃动态合批。参见 https://docs.cocos.com/creator/manual/zh/advanced-topics/dynamic-atlas.html

  • 待处理label

drawcall 是3

  • build 后的效果

drawcall 还是3

Demo:

case.zip (1.6 MB)

大佬帮忙看看吧~

大佬帮忙看下 demo 吧~:sweat:

顶阿顶

大佬帮忙看下 demo 吧 , :grin:

引擎自身也会占用 drawcall 的。你应该是把节点去掉看看空场景 drawcall 是不是 2

并不是。。。空场景是1~

顶阿阿

顶阿阿

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的参数一致)

2赞

60RMB支付了吗

1赞

60rmb 支付了吗 mark

还没有 ,主要是我还没搞定。。。

哈哈,引擎问题无偿服务,用户是我们的上帝:grin:

4赞

希望更深入了解的小伙伴,可以阅读官方文档:《UI 渲染批次合并指南》