Unity3D-优化之一 Drawcall

来源:互联网 发布:淘宝美工一般怎么抠图 编辑:程序博客网 时间:2024/06/06 11:02

Drawcall


  • 什么是drawcall
  • drawcall数目对性能的影响
  • 什么是batch
  • 决定drawcall数目的因素
  • drawcall的优化

1. 什么是drawcall

Unity每次在准备数据并通知GPU渲染的过程称为一次Draw Call。一个 Draw Call,等于呼叫一次 DrawIndexedPrimitive (DX) or glDrawElements (OGL),等于一个 Batch

2.drawcall数目对性能的影响

在屏幕上渲染物体,引擎需要发出一个绘制调用来访问图形API。每个绘制调用需要进行大量的工作来访问图形API,从而导致了CPU方面显著的性能开销。

3. 什么是batch

Unity在运行时可以将一些物体进行合并,从而用一个绘制调用来渲染他们。这一操作,我们称之为“批处理(batch)”。一般来说,Unity批处理的物体越多,你就会得到越好的渲染性能。

  1. 材质

    只有拥有相同材质的物体才可以进行批处理。因此,如果你想要得到良好的批处理效果,你需要在程序中尽可能地复用材质和物体。

    如果你的两个材质仅仅是纹理不同,那么你可以通过 纹理拼合 操作来将这两张纹理拼合成一张大的纹理。一旦纹理拼合在一起,你就可以使用这个单一材质来替代之前的两个材质了。

    如果你需要通过脚本来访问复用材质属性,那么值得注意的是改变Renderer.material将会造成一份材质的拷贝。因此,你应该使用Renderer.sharedMaterial来保证材质的共享状态。

  2. 动态批处理

    如果动态物体共用着相同的材质,那么Unity会自动对这些物体进行批处理。

    动态批处理操作是自动完成的,并不需要你进行额外的操作。

  3. 静态批处理

    相对而言,静态批处理操作允许引擎对任意大小的几何物体进行批处理操作来降低绘制调用(只要这些物体不移动,并且拥有相同的材质)。因此,静态批处理比动态批处理更加有效,你应该尽量低使用它,因为它需要更少的CPU开销。

4. 决定drawcall数目的因素

1.渲染对象数

对于使用不同材质的对象,每增加一个对象会产生一次drawcall

2.渲染顺序

对于使用相同材质的对象,在非连续渲染的时候,会分别产生一次drawcall

3.是否使用批处理

对于符合条件的对象,可以使用批处理,进行一次drawcall

4.UI是否在同一Panel下

对于使用相同材质的对象,在不同Panel下会分别产生一次drawcall

5. drawcall的优化

1.合并材质(纹理),打图集

2.复用材质

3.使用静态批处理,相同纹理的不动物体合并渲染

4.调整渲染顺序(针对UI,调整深度depth,使相同材质UI尽可能连续渲染)

5.相同atlas的UI,尽量保证在同一Panel下

原创粉丝点击