-
Creator 版本:3.4.2
-
目标平台: web, iOS ,Android
-
重现方式:下面demo可直接下载查看
spine_demo.zip (184.8 KB) -
重现概率: 100%
2赞
我也在寻找解决方案
一般来说是spine用了颜色渐变就会产生多个DC,把颜色渐变去掉就好
spine动画里用了多个不同的混合模式
目测spine用了混合模式
处理动画避免还能不能从程序入手,unity好像程序解决了
能不能从程序入手降低DrawCall
然而并不能!
个人试验,将spine渲染提交里面的这里_drawList.data里所有用一个buffer提交就能单spine内合批,我试验的所有spine每个内部都是用的同一个纹理和材质实例,具体有没有其他问题没有测试。
甚至可以仿照autoMergeBatches再写一个自动合批提交函数,将相同spine也合批提交了。
我也看到了这里,改了一天还是没有实现一次性提交就到这里来发帖子
我晚上下班回家后在这里发一下代码吧,我在家里电脑上改的
谢谢大佬

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适用吗大佬,适用的话我也去改了试一下
楼下有大佬代码,一起测试下呗
