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

  • Creator 版本:3.4.2

  • 目标平台: web, iOS ,Android

  • 重现方式:下面demo可直接下载查看
    spine_demo.zip (184.8 KB)

  • 重现概率: 100%

2赞

@jare 能不能给个解决方案啊

1赞

:+1: 我也在寻找解决方案

一般来说是spine用了颜色渐变就会产生多个DC,把颜色渐变去掉就好

spine动画里用了多个不同的混合模式

目测spine用了混合模式

处理动画避免还能不能从程序入手,unity好像程序解决了

能不能从程序入手降低DrawCall

然而并不能!

个人试验,将spine渲染提交里面的这里_drawList.data里所有用一个buffer提交就能单spine内合批,我试验的所有spine每个内部都是用的同一个纹理和材质实例,具体有没有其他问题没有测试。

甚至可以仿照autoMergeBatches再写一个自动合批提交函数,将相同spine也合批提交了。

我也看到了这里,改了一天还是没有实现一次性提交就到这里来发帖子

我晚上下班回家后在这里发一下代码吧,我在家里电脑上改的

谢谢大佬 :+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适用吗大佬,适用的话我也去改了试一下

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