initWithSpriteFrame渲染通道异常与draw call变高问题

如题:

  1. 通过 initWithSpriteFrame 更新纹理会导致显示异常

initWithSpriteFrame中会调用initWithTexture,这时会重置

_opacityModifyRGB = true;
_blendFunc = BlendFunc::ALPHA_PREMULTIPLIED;

但是texture相同时, 并不会调用**updateBlendFunc**方法。

setSpriteFrame是没问题,但是Widget的子类都没有提供方法改变纹理,如 ImageView 只有loadTexture 也是调用的 initWithSpriteFrame。

  1. 通过initWithSpriteFrame设置的Sprite无法 和initWithTexture 的Sprite(使用的是同一texture) 甚至 空Sprite 合并draw call。
        var A = new cc.Sprite();
        A.initWithSpriteFrame(frame);
        this.addChild(A);
        var b = new cc.Sprite();
        A.addChild(b);
        var A = new cc.Sprite();
        A.initWithSpriteFrame(frame);
        this.addChild(A);
        var c = new cc.Sprite();
        c.initWithTexture(frame.getTexture());
        A.addChild(c);

如上两种情况都会出现draw call异常, 如果不使用initWithSpriteFrame则不会出现, 原因还没查,这对于大型游戏有很多层级嵌套的情况是非常难受的。

@minggo
@panda
@jare
@dumganhar

看了下 第二个问题应该是纹理裁切后parentTransform改变 造成子sprite默认计算出来后可见了, 然后渲染了cc_2x2_white_image造成的.

根据这个就能测试出initWithTexture如果设置子sprite的坐标后也会出现gl call增长在问题,

看来应该把不带背景图的容器全部改成Node这些不带spriteRender的组件.