一个spine动画在一个图里会有多个DrawCall

谢谢大佬 :+1: :blush:

import { _decorator, Component, Node, sp } from 'cc';

const { ccclass, property } = _decorator;

let indexCount = 0;

@ccclass('test')

export class test extends Component {

    start() {

        //@ts-ignore

        sp.Skeleton.prototype._render = function(batcher: any) {

            if (this._renderData && this._drawList) {

                const rd = this._renderData;

                const chunk = rd.chunk;

                const accessor = chunk.vertexAccessor;

                const meshBuffer = rd.getMeshBuffer()!;

                const origin = meshBuffer.indexOffset;

                indexCount = 0;

                // Fill index buffer

                accessor.appendIndices(chunk.bufferId, rd.indices!);

                for (let i = 0; i < this._drawList.length; i++) {

                    const dc = this._drawList.data[i];

                    if (dc.texture) {

                        indexCount += dc.indexCount;

                    }

                }

                if (this._drawList.length > 0){

                    this._drawIdx = this._drawList.length - 1;

                    const dc = this._drawList.data[0];

                    if (dc.texture){

                        const ib = meshBuffer.requireFreeIA(batcher.device);

                        ib.firstIndex = origin;

                        ib.indexCount = indexCount;

                        batcher.commitIA(this, ib, dc.texture, dc.material!, this.node);

                    }

                }


            }

        }

    }

   

}
7赞

这样就能单spine内合批了,不过没有多测试,如果测试有啥问题可以一起讨论讨论

大佬这写法牛啊,我是用的继承还要重写挂组件,学到

哈哈,毕竟用不到修改太多的代码

这个2.4适用吗大佬,适用的话我也去改了试一下

楼下有大佬代码,一起测试下呗

这个不适用于2.x,对于2.x底层我研究的不多

好的,3q

我找动画的伙伴确认了下用了叠加模式的动画会出问题,还有就是想请教下大佬this._drawIdx的_drawIdx在哪儿用到的啊,我没看到这个变量在哪儿用到了,给您个测试用的动画有空帮我瞧瞧么spine.zip (981.5 KB) ,还有个问题我在想如果一个spine动画里面有多个图集会不会又问题呢

如果用了叠加模式,估计是材质有所不同,如果多个图集,会出问题,解决方法是可以代码写的更智能一点,遍历到使用相同材质和相同图集的合批,其它就不合批。其它问题我下班看看

用材质判断哦,我还在去找叠加的变量呢 :joy:,谢谢大佬指点,我再去看看

叠加一般是材质相关,而普通合批的先决条件就是同一个材质,同一个或可合并的纹理

去2.4.x里看了看,连个相同的方法名字都找不到。哎。

大佬,看看我的帖子,有空解答一下。谢谢哈。

复制多份。之后drawCall情况如图


改了源码之后那个人物的背景变黑了,我提供的文件里好像给了给了对比图 的吧

仔细研究了下,因为用到叠加模式的spine无法用同一个材质,也就无法合批,因为引擎的叠加是每一个材质一种叠加模式的,除非更深层的修改数据,让spine的各层数据统一进入各个顶点在材质内部做叠加,但这不现实,会增加不少存储数据,得不偿失。

那现在能做到就加个判断如果有叠加就不合批,没有叠加就用您改的那个逻辑是不

在这方面,引擎已经做好了,不用修改。。。