2.1.x 相同材质sprite可以合批嘛?

我在shader里需要设置一个float类型的值iPercent,以及一个时间变量iTime,这样的情况可以合批嘛?

补充:sprite的纹理和混合属性也是一样的哈。

材质、纹理相同的可以合批。如果你的sprite都是用这个自定义的shader的话,且纹理需要相同。自定义的材质不能使用自动合批的功能,因为跟其他的正常的label以及sprite这些相比它们是不一样的

我有连续10个sprite都是用这个自定义材质,会设置

并且我会update里

我发现这10个sprite合批是被打断了的,当我注释掉设置iTime的代码时,我发现相同iPercent值的sprite又被合批了。
我就想知道有没有办法可以解决这个合批的问题,因为实际上我们可能有几十sprite,不能合批还是很难受的。

texturePacker或者自动图集将这几个sprite的texture打到一起去,应该就可以

纹理时是同一张呢

这里有个例子
Demo.zip (728.2 KB)

iTime应该可以避免每一帧都更新吧

是的,但是不解决问题呀:cold_sweat:

如果材质有用到uv的信息,合图之后shader就有问题了。

不能只在初始化的时候设置一次iTime么,然后shader里面计算这个时间差么

fs里可以获取到时间么? 我不知道耶,shader我也是半吊水,记得以前有个CC_TIME,现在给屏蔽了。

这个可以解决的。

我还没写过shader呢?就用过没自己写过,改了改参数

咋解决的

在代码里把合图后纹理在大图的信息(是否旋转,坐标之类的)算好,然后再传到片段着色器里嘛。

我是说合批咋解决的

还不知道呢…

看了一下源码,setProperty会更新material的hash CCMaterial.js#L158,计算hash的方法,相同值property计算出hash是一样的 CCMaterial.js#L214

所以一个折中的办法就是:
1.把sprite根据iPercent排序,尽量让值相同的合在一起。
2.把所有sprite每帧更新iTime的值为同一个值,这样相同iPercent和iTime值计算出hash就一样了。


我在想有没有可能像设置a_color那样,在顶点着色器里设置值,这样是不是就不会打断合批了? 只是这接口没找着,没法试验。

你是不是想做血条的波动效果。 time应该是可以优化到shader里面的。percent也是没有必要的,因为你可以直接设置sprite的size,然后引擎自动帮你合批了!

嗯嗯,就是血条波动的效果。 直接设置size不会变形么?:sweat_smile: