Unity优化之Drawcall

本文介绍了Unity中Drawcalls的概念及其对程序性能的影响,并详细阐述了3D场景和2D UI方面的Drawcalls优化方法,包括静态批处理、动态批处理、使用图集等。

一、什么是Drawcalls

在Unity中,每次CPU准备数据并通知GPU的过程就称之为一个DrawCall。这个过程会指定一个Mesh被渲染,绘制材质。

二、Drawcalls有什么影响

为了CPU和GPU可以进行并行工作,需要一个命令缓冲区,由CPU向其中添加命令,然后由GPU从中读取命令,这样就实现了通过CPU准备数据,通知GPU进行渲染。在每次调用DrawCall之前,CPU需要向GPU发送很多内容,主要是包括数据,渲染状态,命令等。所以如果DrawCall数量过多就会导致CPU进行大量计算,进而导致CPU的过载,影响程序运行效率。

三、查看Drawcalls

在unity中查看drawcalls有2个方法,如图1所示查看Game窗口中的State下的Batces,这个数量和drawcalls数量相同。第二种方法是查看Window  → Analysis → Profiler 中的Rendering下的Drawcalls,如图2所示。 

图1                                                                                图2

四、Drawcalls优化

1. 3D场景优化

1.1 静态批处理

### 如何在 Unity优化场景以减少 Draw Call 数量 #### 合并材质 通过合并具有相同属性的多个材质成单个材质,能够显著减少 Draw Call 的数量。当多个对象共享同一个材质时,Unity 可以更高效地处理这些对象,从而减少了 CPU 和 GPU 之间的通信次数[^1]。 #### 使用批处理技术 静态批处理允许将不移动的游戏对象组合在一起作为一个单独的对象进行渲染;动态批处理则适用于较小且频繁变换位置的对象。这两种方法都可以有效降低 Draw Call 次数,因为它们使得更多的几何体可以在一次绘图命令中被提交给 GPU 处理[^2]。 #### 减少可见物体的数量 合理设置摄像机视锥裁剪参数以及利用遮挡剔除功能可以帮助隐藏不必要的物体,进而间接降低了实际参与渲染阶段的实体数目,这也有助于削减总的 Draw Call 调用量[^3]。 #### LOD (Level of Detail) 技术的应用 对于远离玩家视角或者距离较远而不需要精细显示效果的模型采用简化版本代替原版复杂度较高的模型,在不影响视觉体验的前提下进一步压缩了每帧所需执行的 Draw Calls。 ```csharp // 示例代码展示如何启用LOD组组件 using UnityEngine; public class EnableLOD : MonoBehaviour { void Start() { SkinnedMeshRenderer[] renderers = GetComponentsInChildren<SkinnedMeshRenderer>(); foreach(SkinnedMeshRenderer renderer in renderers){ if(renderer.gameObject.activeInHierarchy && !renderer.useLightProbes){ LODGroup lodg = renderer.GetComponent<LODGroup>(); if(lodg != null){ lodg.enabled = true; } } } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值