Unity URP中的Static Batching、GPU Instancing、SRPBatcher简单介绍

Static Batching

将一组静态物体的模型batch成一个模型,并作为一个整体提交的GPU。绘制的时候这些物体可以正常的做culling,Unity会将通过Culling的物体使用索引偏移的方式绘制。

GPU Instancing

使用 GPU Instancing可使用少量绘制调用一次绘制(或渲染)同一网格的多个副本。它对于绘制诸如建筑物、树木和草地之类的在场景中重复出现的对象非常有用。

合并批次的前提条件是同网格同材质,但材质的参数可以不同,然后基于一个Instanced Draw Call,一次性绘制多个模型。

使用比较多的是植被相关的,比如草和树木。在使用上需要注意当代码调用改变属性时候,需要用MaterialPropertyBlock,从而不会破坏GPU Instancing。更为详细的知识可以阅读官方文档。

 SRP Batcher

SRP Batcher是URP的一种新的合批技术,可以加速CPU,对于DX平台提升比较大,但对于移动平台来说,提升不是很明显,大概1.2倍左右,这部分还根据不同机型有一些差距,感兴趣的可以拿机子去验证。

原理是减少set pass call,即针对基于同一个shader变体的不同的材质,将他们的材质属性(uniform)放到一个block(UBO)中,将这些不同的材质的属性block全部上传到GPU,以及将使用这些材质的模型的属性(如矩阵等)也上传到显存。绘制的时候,只要从显存中绑定需要使用的block,然后执行一个draw call即可。这样从CPU向GPU传递数据的次数(set pass call)大大降低。

一个Drawcall被一个新的材质使用的时候,需要准备进行渲染设置工作,这部分耗时是一个drawcall的主要耗时点,所以如果场景有越多的materials,就会有越多的CPU必须使用去设置GPU 数据。传统的优化做法是减少drawcall数量去提升CPU渲染性能,而实际上真正的CPU消耗来自那些设置工作,而不是GPU drawcall本身,Drawcall只是一些Unity向GPU的 command buffer发送的字节数据。

URP的默认材质支持SRP Batcher

SRP中几种Bathcing方式的优先级

1.如果物体是静态的(Batching Static),则会使用Static Batching。如果物体的材质兼容SRP Batcher,则会同时使用SRP Batcher。
2.如果物体的材质和Renderer兼容GPU Instancing,则会启用GPU Instancing
3.如果开启了Dynamic Batching,则会使用动态Batch。
由上可知,如果想启用GPU Instancing,必须不能开启Static Batching,且不能满足SRP Batcher条件。
如果材质是兼容GPU Instancing的,且物体是开启了Static Batching的,则Unity会在物体的Inspector中给出提示:

GPU Instacing开启的条件 

1.首先Shader必须兼容与Instancing。
2.材质开启 Enable GPU Instancing
3.SRP Batcher的优先级高于GPU Instancing,对于Game Objects,如果SRP Batcher能被使用(Shader兼容SRP Batcher,节点本身也兼容等),则就会使用SRP Batcher,即便材质开启了Enable GPU Instancing也没用。
4.如果SPR Batcher的条件被破坏,例如使用了MaterialPropertyBlock,且开启了Enable GPU Instancing,则GPU Instancing则会启用。

GPU Instancing的性能

  • GPU Instancing对于顶点数比较少的模型不一定能提高性能,因为顶点数少时GPU不能充分的分配资源去绘制多个实例,这个顶点数的阈值根据不同显卡是不一样的,但一般来说少于256个顶点是不合适的。
  • 如果有很多顶点少的物体需要绘制,可以将他们合并到一个mesh中进行绘制

tips:

在URP管道中使用GPU Instancing和SRP Batcher需要注意,二者只能存在其中一种,而SRP Batcher优先级最高,对于写草和树的Shader,比较建议直接支持GPU Instancing,而不支持SRP Batcher, 在移动端上效率相对SRP Batcher更好。Static batching一般用于mesh网格比较细碎的静态对象,将网格在一批次进行渲染,但是由于形成了新的mesh,会增加内存占用。
 

猜你喜欢

转载自blog.csdn.net/Star_MengMeng/article/details/126526498