最近研究自身项目发现,场景中DrawCall出奇的高,结果发现项目中的草模型Unity自动进行了批处理,而花模型却没能批处理。也就是一个花,就增加了一个Drawcall.于是有了下面对DC的研究。先附上能动态合批的条件:
1.动态批处理仅支持顶点数小于900的网格物体。
2.如果Shader使用了顶点位置、法线、UV值三种属性,则只能动态批处理300个顶点以下的物体。如果Shader使用了顶点位置、法线、UV0、UV1 和切向量,那么只能动态批处理180个顶点以下的物体。
3.不要使用缩放,分别有缩放(1,1,1)和(2,2,2)的两个物体将不会进行批处理。
4.统一缩放的物体不会与非统一缩放的物体进行批处理。
5.使用缩放比例(1,1,1)和(1,2,1)的两个物体将不会进行批处理,但使用缩放尺度(1,2,1)和(1,3,1)的两个物体可以进行批处理。
6.使用不同材质的实例化物体将会导致批处理失败。
7.拥有lightmap的物体不会进行批处理,除非他们指向lightmap的同一部分。
8.多通道的Shader会妨碍批处理。因为几乎Unity中所有的着色器都在前向渲染中支持多个光源,并为其有效开辟多个通道。
9.预制体的实例化会自动使用相同的网格模型和材质
而我项目中花模型之所以没能合批处理,是因为使用了UV,且顶点数大于了300.这里uv2就忽略吧,可能是美术的原因,不需要uv2的。
那解决的办法,就是把这个600左右顶点的模型,拆分成两个顶点数小于300的模型,然后把它做成一个和原来一样的Prefab去使用。当然这里拆分模型就需要美术在3DMAX里去做一下处理,保证拆分成的单个模型可以做到批处理。拆分后的图如下:
这样就可以把花做动态合批了。看效果:
但这样做适用于比较大规模量化的模型,比如花草之类的。如果只是少数几个,应该来说是得不偿失。数据如下:
在未拆分前,每添加一个模型,添加了两个Batches。(本身虽然是一个模型,但)
拆分之后,每添加一个,Saved by batching增加了四个。Batches不变。
通过这种方式成功将DC从原来的100多降低到了60.但可悲的是,发现项目影响帧率的因素并不在这里。而是阴影。。。。后续继续做进一步分析。