关于DrawCall如何优化

各位大佬下午好~,我这里是一个拼图游戏,DrawCall非常非常高


我猜测问题来源于图中的三角形数目,先说一下这个图是如何做出来的

  1. 在一个可以包含整个马头的区域内铺满小正方形,把马头图片放上去,根据马头图片颜色(透明或者黑色),对所有的小正方形进行切割,我这里是直接用readpixiel返回数组编辑像素来完成切割的,没有用shader,shader会好一些嘛?而且我这里把数组变成spriteframe的代码是从网上找的,这个代码似乎不能动态合图,否则会提示很多WebGL的错误,代码如下:

// 像素点生成图片
export function ArrayToSpriteFrame(buffer: Uint8Array, width: number, height: number): SpriteFrame | null{
// 生成一张新的图来进行替换
let imageAsset: ImageAsset = new ImageAsset();
imageAsset.reset({
_data: buffer,
width: width,
height: height,
format: Texture2D.PixelFormat.RGBA8888,
_compressed: false
});
let tex: Texture2D = new Texture2D();
tex.image = imageAsset;
let spriteFrame = new SpriteFrame();
spriteFrame.texture = tex;
spriteFrame.packable = false;
// 返回新的图
return spriteFrame;
}

  1. 下方的选项部分,是通过找到上方马头中对应位置的正方形,把切割好的spriteframe给拿过来。下方选项其实挺多的,用了一个scrowview。
    哪个大佬路过抬我一手,救死扶伤啊。。。。。。。。。

按道理来说你这个也不可能这么多DC,你是一个格子一个sp?

是的,一个格子一个spriteframe

你这个做法肯定不行,你试试可以把一张图里的所有格子整合到一张图上

如果我用分开的格子,有办法合起来嘛,动态合图之类的,放到一张图上,游戏的很多操作会受影响

image 你的这个是一个sp吗

还是又6个sp?

不是的,一个方块是一个,一个小方块,上方的大图里也是

那就把他们的数据整合成一个sp

呃呃呃,这怎么合成呢请问

用TexturePacker把你零碎的图片打包成图集,然后图片节点用图集加载

把两张图合成一张图,在只用cc.Texture2D的情况下可以做到吗 - Creator 2.x - Cocos中文社区也可以看看这个

合图非常难顶,算不明白,最后的办法是,切割完之后关闭小方格,不让它显示出来,然后编辑模板大图增加黑色线条并显示,这样可以进行之后的操作,drawcall也大幅度下降。。。。。