Draw Call Batch的文档解释

官方文档:https://docs.unity3d.com/Manual/DrawCallBatching.html

1.什么是Draw call

在屏幕上画一个游戏对象,引擎必须对图形API(如OpenGL或者Direct3D)发出一个draw调用.Draw调用通常是资源密集型的,图形API为每个Draw调用执行重要的工作,这会在CPU端造成性能开销.这主要是由于绘制调用之间的状态变换(例如切换到不同的材质)造成的,这会导致图形驱动程序中的资源密集型验证和转换步骤.

解决方法:
1.Dynamic batching
:对于足够小的网格,这将转换它们在CPU上的顶点,将许多相似的顶点组合在一起,并一次性将它们全部绘制出来。
2.Static batching:将静态(不移动的)游戏对象合并到大网格中,并以更快的方式呈现它们。

note:与手工合并GameObjects相比,内置的批处理有几个优点;最值得注意的是,GameObjects仍然可以单独选择。然而,它也有一些缺点;静态批处理会带来内存和存储开销,而动态批处理会带来一些CPU开销。

材质设置

只有具有相同材质的游戏对象才能被组合在一起(合批),因此,如果你想要有个好的批处理,你就应该致力于在尽可能多的不同的游戏对象之间共享材质.
如果你有两个完全相同的Materials只是Texture不同,你可以把他们(Texture)合并成一个大的Texture.这个过程通常称为纹理的图集( 详细请看Texture atlases).一旦纹理在同一个图集中,您就可以使用单一的材质.

注意:如过通过脚本访问共享的材质属性,需要注意的是修改 Renderer.material会创建一个新的材质,而使用Renderer.sharedMaterial就可以保持材料的共享.

阴影通常可以再渲染时进行批处理,即使他们的材质不同.Unity中阴影投射即使使用不同的材质也可以使用动态批处理,只要阴影通道所需的材质值是相同的.

Dynamic batching (Meshes)

Unity可以自动批处理移动的游戏对象到相同的绘制调用中,如果他们共享相同的材质和满足其他的标准.动态批处理是自动完成的,不需要你做任何额外的事.

1.批处理动态游戏对象的每个顶点都有一定的开销,因此批处理只适用于包含不超过900个顶点属性和不超过300个顶点的网格。
2.如果GameObject(游戏对象)在转换中包含镜像,则它们不会批量处理(例如,GameObject A(具有+1比例)和GameObject B(具有-1比例)不能一起批量处理)。
3.使用不同的材质实例会导致GameObjects不能批处理在一起,即使它们本质上是相同的。唯一的例外是阴影施法者渲染。
4.GameObjects以及材质与在lightmap中添加其他渲染器参数:lightmap索引和偏移/缩放。通常,动态光映射游戏对象应该指向完全相同的光映射位置进行批处理。
5.

动态批处理工作原理是将所有GameObject顶点转换为CPU上的世界空间,因此只有当工作小与draw调用时才有优势.draw调用的资源需求取决于许多因素,主要是使用的图形API.例如,在控制台或像Apple Metal这样的现在API上,draw调用开销通常要低的多,而且通常动态批处理根本不是优势.

Static batching

静态批处理允许引擎减少对任何尺寸的几何图形的绘制要求,前提是它共享相同的材料,并且不移动。它通常比动态批处理更有效(它不转换CPU上的顶点),但是它使用更多的内存。

使用静态批处理需要额外的内存来存储组合几何图形。如果多个GameObject在静态批处理之前共享相同的几何体,那么将在编辑器或运行时为每个GameObject创建一个几何体副本。这可能并不总是一个好主意;有时,为了保持更小的内存占用,您不得不牺牲呈现性能,避免对某些GameObjects进行静态批处理。例如,在浓密的森林中,将树标记为静态会对内存产生严重影响。

Tips

目前,只有 Mesh Renderers
Trail Renderers
Line Renderers
Particle Systems
 and Sprite Renderers批处理.这意味着蒙皮网格,Cloth和其他类型的渲染组件是没有批处理的.

渲染器只与其他相同类型的渲染器进行批处理。

半透明着色器通常要求gameobject(游戏对象)按前后顺序渲染,以便透明.Unity首先按照这个顺序对Gameobject进行排序,然后尝试对他们进行批处理,但由于必须严格满足顺序,这通常意味着与不透明的Gameobject相比,可以实现的批处理更少.

手动组合彼此接近的Gameobject可能是绘制调用批处理的一个非常好的替代方法.例如,一个有很多抽屉的静态柜橱通常可以合并成一个网格,无论是在3D建模应用程序中还是使用 Mesh.CombineMeshes.

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值