(附范例) 单spine可合并drawcall,请教多个的合并方式

试了好久,所以上来求助各位,

先附上democc221spineDC.zip (920.5 KB)

使用下面的代码,
也就是点击 “直接产生:1个” 的时候,
可以看到spine合并drawcall的过程,一开始是20,然后会下降到10

for( let idx = 0; idx < 10; idx++ )
{
    let node1 = new cc.Node();
    node1.parent = _bas;        //先产生在base,
    node1.scale = 0.2;
    node1.x = idx * 50;
    
    let $sp1 = node1.addComponent( sp.Skeleton );
    $sp1.skeletonData = skData1;
    $sp1.setAnimation( 0, 'walk', true );
    
    
    setTimeout( () =>
    {
        addToNodeInBoxBy( $sp1 );
        
        $sp1.enableBatch = true;
        $sp1.setAnimationCacheMode( sp.Skeleton.AnimationCacheMode.PRIVATE_CACHE );
        $sp1.setAnimation( 0, 'walk', true );
        
        cc.log( `移动: ${ idx }` );   //定时移到_box, dc会因为spine合并而减少
        
    }, idx * 500 );
}

但是,奇怪的事情发生了…
同样的逻辑,用两份spine就不行了…
我在 addToNodeInBoxBy 方法中,有依据SkeletonData的uuid去创建不同的node,
确保相同贴图的spine是放在同一个node中的,但是drawcall依然无法合并

for( let idx = 0; idx < 10; idx++ )
{
    let node1 = new cc.Node();
    node1.parent = _bas;        //先产生在base,
    node1.scale = 0.2;
    node1.x = idx * 50;
    
    let $sp1 = node1.addComponent( sp.Skeleton );
    $sp1.skeletonData = skData1;
    $sp1.setAnimation( 0, 'walk', true );
    
    let node2 = new cc.Node();
    node2.parent = _bas;        //先产生在base,
    node2.scale = 0.2;
    node2.x = idx * 50;
    node2.y = 35;
    
    let $sp2 = node2.addComponent( sp.Skeleton );
    $sp2.skeletonData = skData2;
    $sp2.setAnimation( 0, 'walk', true );
    
    
    setTimeout( () =>
    {
        addToNodeInBoxBy( $sp1 );
        $sp1.enableBatch = true;
        $sp1.setAnimationCacheMode( sp.Skeleton.AnimationCacheMode.PRIVATE_CACHE );
        $sp1.setAnimation( 0, 'walk', true );
        
        addToNodeInBoxBy( $sp2 );
        
        $sp2.enableBatch = true;
        $sp2.setAnimationCacheMode( sp.Skeleton.AnimationCacheMode.PRIVATE_CACHE );
        $sp2.setAnimation( 0, 'walk', true );
        
        cc.log( `移动: ${ idx }` );   //定时移到_box, dc会因为spine合并而减少
        
    }, idx * 500 );
}

请教引擎组的各位大神,以及各位高手,
如何使用spine的正确合并drawcall的方式,感激不尽



按照你的demo。两份spine资源,同一份资源都合并到1个dc中,最后是12个dc,有什么问题么?

疑?有这种事 OAO

我这边只有产生1个的时候可以合并成功,

产生2个一直都是合并失败的

这个产生2个的永远是30个DC…

我的测试环境是macOS 10.14.6,Nvidia的显卡,
不晓得这有没有相关…

感谢大神帮忙测试,不过这样我又更头痛了
我换一部电脑试试看

模拟器里面测的?你的目标平台是mac么?还是原生iOS或Android?Web?

是的,模似器里面测的,目标平台是android,
我刚刚打了安卓包,试过实机测试,在三星Note8上,也是一样没有合并的情况

我换另一部Mac 10.13.6测试也是一样的情况,
我手边没有windows的系统能测试,

不过web平台的确就可以合并成功

在真机上的话,你试下,要在运行前,在main.js中加入下面的代码

    cc.macro.CLEANUP_IMAGE_CACHE = false;
    cc.dynamicAtlasManager.enabled = true;

用的是2.2.1?2.2.0以下的话,enableBatch在原生平台下是不生效的

好的,我試下真機,
是的,是2.2.1

经过测试还是一样,真机上已经加了代码

依然是一个的可以合并,二个就不能了

真机是三星的Note4 (android 5.1)
以及三星的Note8 (android 8 )

他说到在打包生成的main.js 里面添加

谢谢提醒,没看清楚,我再重试看看

这次应该是加对了,

不过反应还是一样的,DrawCall未合并

但是在模似器就无法成功合并了,我想真机应该更不会合并才是
稍早是基于测试的心态想说说不定真机上可以,才试试真机的

理论上若能合并在模似器里就能成功合并才是

稍等,我们查一下,确实android上复现出来了,没有进行batch

1赞

你是不是没有设置图片到层级
你把2个动画 分别设置成不同的zIndex

1赞

spine是依贴图分在不同node里
zindex没有设置,预设应该为0吧

若设置了zindex,连单个spine都会无法合并drawcall

谢谢大神,再麻煩您了

那么mac的模似器里无法合併是正常的吗?

模拟器和真机环境不一样,mac上的模拟器可以看作是mac平台的版本,目前我们主要是需要支持web和原生平台

暸解,所以得打包到真机里看最终效果才准确
谢谢大神

按照这个PR修复就行
https://github.com/cocos-creator/cocos2d-x-lite/pull/1993

2赞