动态配料不生效该怎么办

  

Dynamic Batching不生效该怎么办,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

最近在项目开发过程中,无意发现游戏场景的绘制占用了大量的Batches,几乎一个模型显示就占用了一个Batch,而Saved by batching数量几乎为0,即没有任何合批渲染优化。这显然跟预期相去甚远,因为虽然场景里有多达上百个模型需要绘制,但大部分都是一模一样的卡牌模型,引用相同的材质球,按理绝大部分都是可以被Unity自动dynamic batching,进行合并批处理的。哪到底是哪里出了问题?

于是翻看Unity Manual,检查Dynamic Batching的规则,可以简单概括为以下几条:

  1. 一般情况下,Unity仅支持对Meshes小于900顶点的物体进行Dynamic Batching,如果Shader里使用了顶点位置,法线,UV值,则仅支持300顶点以下的物体;如果使用顶点位置,法线,UV0,UV1和Tangent向量,则仅支持180顶点以下的物体。

  2. 如果两个物体的scale刚好是呈镜像的,如scale分别为(-1,-1,-1)或(1,1,1),他们不会被Dynamic Batching。

  3. 引用材质实例不同的物体不会被Dynamic Batching,即使两个物体的材质本质上没有任何不同。这句话的理解有点绕,简单举例就是说,相同的材质实例化了两份,分别被A和B引用了,那么A和B是不会被Dynamic Batching的,因为他们引用的是两个不同的实例。

  4. 拥用lightmaps的物体将不会被Dynamic Batching,除非他们指向了lightmap的同一部分。

  5. 拥有多Pass通道的Shader的物体不会被Dynamic batching。

简单排查下,模型是达到Unity的1,2,4,5点要求的。于是开始怀疑材质实例引用不同导致了问题。

Dynamic Batching不生效该怎么办

查看Inspector,可以看到Mesh Renderer引用的Material确实就是所需要的材质球,但后面却加了Instance字眼,单击图中红框处,Project窗口也并没有跳转到材质球文件所有位置,说明这份material是在运行时被实例化的,不是Prafab预设时指向的材质球引用。由此我们可以推测,每份模型都各自实例化了一份自己的material实例,导致没有被Dynamic Batching。知道了问题原因,还要知道问题出在哪里。检查物体上绑定的脚本,查看与material相关的代码,可以看到有这么两处:

    private Texture _mainPlaneTex;    private Texture _flashPlaneTex;    public MeshRenderer m_rendererPlane;    private Material _cachedPlaneMaterial = null;    private Material cachedPlaneMat
  ,,,{,,,,,,,
  ,,,,,,,{,,,,,,,,,,,if  (_cachedPlaneMaterial ==, null ,,, m_rendererPlane  !=, null)
  ,,,,,,,,,,,{
  ,,,,,,,,,,,,,,,_cachedPlaneMaterial =, m_rendererPlane.material;
  ,,,,,,,,,,,},,,,,,,,,,,,return  _cachedPlaneMaterial;
  ,,,,,,,}
  ,,,}
<>之前,,,,private  void  SetGray (bool  bGray)   ,,,{,,,,,,,if  (bGray)   ,,,,,,,{   ,,,,,,,,,,,cachedPlaneMat.SetTexture (“_MainTex",, _flashPlaneTex);   ,,,,,,,},,,,,,,,   ,,,,,,,{   ,,,,,,,,,,,cachedPlaneMat.SetTexture (“_MainTex",, _mainPlaneTex);   ,,,,,,,}   ,,,}

这个模型有模型变灰色的需求,实现方式是通过获取该物体的材料,再视情况将MainTexture设置为正常/变灰贴图。出问题的地方十有八九就在这块代码。查看MeshRenderer的接口,原来统一提供了两个获取材料的方法接口,分别是材料及sharedMaterial。
搞懂这两个接口的区别,弄清楚团结在底层到底搞了什么鬼,估计离真相就不远了。

渲染器。材料

返回第一个实例化材料分配给渲染器。
修改材料会改变材料为这个对象alt=岸淞喜簧Ц迷趺窗?>

优化前

岸淞喜簧Ц迷趺窗?

优化后

可以看的到,在同屏模型较多的情况下,批数由近100骤降到2,基本都被统一动态合批处理了。

看完上述内容,你们掌握动态配料不生效该怎么办的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!

动态配料不生效该怎么办