Unity中DrawCall的含义,以及其优化

Draw Call的含义

在Unity中,Draw Call(绘制调用)是指渲染引擎向图形硬件发送渲染命令以绘制一个或多个图形对象的过程。每个Draw Call都代表了一次绘制操作,渲染引擎将要求图形硬件绘制一个或多个三维物体或图形元素。理解和优化Draw Calls对于提高游戏性能和渲染效率非常重要。

查看Draw Call具体渲染的内容

Unity5.x版本起,Unity引入了Frame Debugger,通过Frame Debugger我们可以看到每一帧中,每个Draw Call对应渲染的内容。该工具可以用于Draw Call的数量优化。

UI层Draw Call的优化

  1. 首先我们要知道Draw Call在UI层合并的原理,当用相同材质和渲染属性的元素连续渲染时,其DrawCall会进行合并。
  2. 为达成合并条件,需要创建一个图集。Unity提供了Sprite Packer工具,可以将多个Sprite打包成Atlas,这可以有效减少Draw Call数量。
  3. 文字会单独占用一个Draw Call,但连续渲染的文字会自动合并为一个Draw Call,UGUI在不影响渲染出来的内容时,会自动将文字的渲染顺序排列到最后执行。(即无遮挡情况下,UGUI将会自动将文字和图片分开渲染,使得文字不打断图片与图片之间的Draw Call合并)
  4. 避免使用Mask组件,Unity的Mask组件可以导致额外的Draw Call。如果可能,尽量避免在UI元素上使用Mask,或者使用Mask时确保它们是必要的。
  5. 合理使用图集(Atlas) ,因为执行一个Draw Call时,需要载入纹理(即图片或图集),当图集内包含的图片过多且大部分不需要用到时,则会导致加载了不必要的内容产生多余的内存损耗。因此合理使用图集,可以提高项目的性能。

场景层Draw Call的优化

  1. 与UI层合并的原理一样,当用相同材质和渲染属性的元素连续渲染时,其DrawCall会进行合并。
  2. 使用静态批处理(Static Batching),将那些不需要在运行时修改的物体标记为“静态”,以启用静态批处理。这会将多个静态物体合并为一个批次。这个选项适用于静态物体,如墙壁、地板等。
  3. 使用GPU Instancing,GPU Instancing是一种渲染技术,允许你绘制多个相同网格但使用不同的数据,而不会增加Draw Call数量。这对于绘制大量相似的物体非常有用,比如树木、草。你需要在Shader中启用GPU Instancing,并使用合适的材质。
  4. 使用Level of Detail(LOD), 对于远处的物体,使用不同级别的多边形模型(LOD)可以减少Draw Call数量。
  5. 使用遮挡剔除(Occlusion Culling),在摄像机中勾选遮挡剔除可以在运行时排除不可见的物体,减少Draw Call数量。参与遮挡剔除的物体需要设置为静态,并通过菜单栏中的 “Window” > “Rendering” > “Occlusion Culling” 生成遮挡剔除数据。
  6. 减少透明物体, 透明物体通常会导致额外的Draw Call,因为它们需要按深度进行排序。减少透明物体的数量可以降低Draw Call数量。
  7. 使用合并材质球(Material Balling), 这是一种手动操作,通过创建一个材质球,将多个材质的属性合并到一个材质球中,然后将这个材质球应用到多个物体上。这可以减少不同材质球之间的切换。通常来说,此操作由TA部门进行实现。

拓展

Skinned Mesh Renderer 合批方案:Animation Instancing: SkinnedMeshRenderer

附:使用URP时,Unity会将Skinned Mesh Renderer 合并为一个批次(Batch),把多个DrawCall所需的数据一并上传到GPU,再一次性绘制,已达到优化性能的目的,此情形下,可无需使用Animation Instancing合批方案。

总结

简而言之,我们将项目中的材质球数量尽可能的减少和重用,尽可能的减少打断渲染的次数。以及根据项目需求,减少一些不必要的物体的渲染(减面或剔除),即可以达到优化Draw Call的目的。

请注意,合并Draw Call是一种权衡。尽管它可以减少Draw Call数量,但过度合并可能导致内存占用过高或不足以应对特定情况下的渲染需求。因此,在应用这些技术时需要进行测试和性能优化,以确保达到最佳的性能和画质平衡。

若有遗漏或描述错误、理解错误的地方,欢迎讨论指出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值