Unity中SetPassCall, Batches的区别,它们与Draw call 的关系

先放官方对于Draw call batch的解释:https://docs.unity3d.com/Manual/DrawCallBatching.html  


在Unity 的优化中,我们经常说要优化Draw call。但是我们在Unity 的视图里的 stats窗口里,看到的与draw call 有关的参数大部分情况下只有SetPassCall 和 Batches两个。

那这两个值分别代表着什么呢?它们谁更贴近draw call 呢?


先来看Setpass Call , 我们不用官方那么高大上的翻译,我们通俗来说,它大致代表的是摄像机照射范围内,所有GameObject所包含的Material种类数量。(不完全准确,但是这样说易于理解)。假如有30种material,那这个SetpassCall的数值也会离这个30比较接近。这个值越大,肯定会使draw call 越来越大。但是setpasscall很小的时候,也有可能draw call的值比较大。为什么我们要看下面这个属性: Batches.


Batches,是unity中合批次。具体的概念这里就不赘述,网上有很多资料。这个值是和Draw call 比较接近的。有时候在项目中,我们的setpass call 数值不高,但是batches出奇的高,结果也会导致draw call 过高而影响游戏的CPU性能。那这个值为什么会过高呢? 主要是因为需要渲染的一些游戏物体不满足Unity的Dynamic batch的要求。当需要渲染的Gameobject过多,而且这些gameobject又不能被Unity 内置的Batch功能自动合并时,每多一个这样的Gameobject,就会多一个Batch,进而就会导致Draw call过高,造成卡顿。这种情况是要尽量避免的。(这里不讨论Static Batch)。那么怎么判断哪些gameobject 是可以被unity 进行动态batch的呢?有如下几点(这里图快,只贴英文):

### UnityBatches 渲染优化批处理原理 #### 动态批处理特性 Unity 提供了动态批处理功能来减少绘制调用次数。这一机制能够自动将满足特定条件的小型网格组合成单一批次进行渲染,从而降低 CPU 负载[^2]。 #### 静态批处理特点 对于不发生位移的游戏对象而言,可应用静态批处理技术。通过标记游戏对象为静态,引擎可以在运行前预先计算好这些对象间的共享信息,在实际游戏中实现更高效的批量渲染效果;不过这样做会增加一定的内存消耗,并且被指定为静态的对象不能再改变其位置、旋转或缩放属性[^1]。 #### 材料属性块 MaterialPropertyBlock 的运用 当面对具有不同材质参数却采用同一着色器程序的情况时,利用 `MaterialPropertyBlock` 类可以有效地让它们参同一批次的渲染流程之中。这有助于进一步精简 draw call 数目,提高性能表现[^3]。 ```csharp var prop = new MaterialPropertyBlock(); prop.SetColor("_Color", Color.red); Graphics.DrawMesh(mesh, transform.localToWorldMatrix, material, submeshIndex, camera, lightProbeUsage, lightProbeProxyVolumeOverride, renderer.materials, shadowCastingMode, receiveShadows, motionVectorGenerationMode, layer, skinnedTransforms, bounds, prop); ``` #### 减少 Draw Call 对 CPU 性能的影响 批处理的核心目的在于减轻 CPU 上每帧准备工作的负担——即所谓的 "draw calls" 或者说是发出绘图指令给 GPU 前所需做的准备工作。尽管如此,这项措施主要是针对提升 CPU 效率而设计,并不会显著影响到图形处理器的工作效率[^4]。 #### SRP 批处理工作机理概述 在现代渲染管线架构下(如 Scriptable Render Pipeline),批处理依旧围绕着如何高效地收集几何阶段的数据并向 GPU 发送命令展开。每一次向 GPU 传递完整的顶点列表及其他必要资源之前所完成的操作就构成了一个批次或者说是一个 draw call[^5]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值