`
wgcode
  • 浏览: 593418 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Unity性能优化之Draw Call

 
阅读更多
Unity性能优化之Draw Call
Unity(或者说基本所有图形引擎)生成一帧画面的处理过程大致可以这样简化描述:引擎首先经过简单的可见性测试,确定摄像机可以看到的物体,然后把这些物体的顶点(包括本地位置、法线、UV等),索引(顶点如何组成三角形),变换(就是物体的位置、旋转、缩放、以及摄像机位置等),相关光源,纹理,渲染方式(由材质/Shader决定)等数据准备好,然后通知图形API——或者就简单地看作是通知GPU——开始绘制,GPU基于这些数据,经过一系列运算,在屏幕上画出成千上万的三角形,最终构成一幅图像。

在Unity中,每次引擎准备数据并通知GPU的过程称为一次Draw Call。这一过程是逐个物体进行的,对于每个物体,不只GPU的渲染,引擎重新设置材质/Shader也是一项非常耗时的操作。因此每帧的Draw Call次数是一项非常重要的性能指标,对于iOS来说应尽量控制在20次以内,这个值可以在编辑器的Statistic窗口看到。

Unity内置了Draw Call Batching技术,从名字就可以看出,它的主要目标就是在一次Draw Call中批量处理多个物体。只要物体的变换和材质相同,GPU就可以按完全相同的方式进行处理,即可以把它们放在一个Draw Call中。Draw Call Batching技术的核心就是在可见性测试之后,检查所有要绘制的物体的材质,把相同材质的分为一组(一个Batch),然后把它们组合成一个物体(统一变换),这样就可以在一个Draw Call中处理多个物体了(实际上是组合后的一个物体)。

但Draw Call Batching存在一个缺陷,就是它需要把一个Batch中的所有物体组合到一起,相当于创建了一个与这些物体加起来一样大的物体,与此同时就需要分配相应大小的内存。这不仅会消耗更多内存,还需要消耗CPU时间。特别是对于移动的物体,每一帧都得重新进行组合,这就需要进行一些权衡,否则得不偿失。但对于静止不动的物体来说,只需要进行一次组合,之后就可以一直使用,效率要高得多。

Unity提供了Dynamic Batching和Static Batching两种方式。Dynamic Batching是完全自动进行的,不需要也无法进行任何干预,对于顶点数在300以内的可移动物体,只要使用相同的材质,就会组成Batch。Static Batching则需要把静止的物体标记为Static,然后无论大小,都会组成Batch。如前文所说,Static Batching显然比Dynamic Batching要高效得多,于是,Static Batching功能是收费的……

要有效利用Draw Call Batching,首先是尽量减少场景中使用的材质数量,即尽量共享材质,对于仅纹理不同的材质可以把纹理组合到一张更大的纹理中(称为Texture Atlasing)。然后是把不会移动的物体标记为Static。此外还可以通过CombineChildren脚本(Standard Assets/Scripts/Unity Scripts/CombineChildren)手动把物体组合在一起,但这个脚本会影响可见性测试,因为组合在一起的物体始终会被看作一个物体,从而会增加GPU要处理的几何体数量,因此要小心使用。

对于复杂的静态场景,还可以考虑自行设计遮挡剔除算法,减少可见的物体数量同时也可以减少Draw Call。

总之,理解Draw Call和Draw Call Batching原理,根据场景特点设计相应的方案来尽量减少Draw Call次数才是王道,其它方面亦然。
分享到:
评论

相关推荐

    Unity3D教程:DrawCall优化1

    本教程将聚焦于DrawCall优化,这是提高Unity3D应用性能的关键一环。 DrawCall,即渲染调用,是GPU执行渲染命令的次数。当场景中有大量独立的绘制对象时,DrawCall的数量会显著增加。每个DrawCall都会引起GPU切换...

    Unity性能优化.pptx

    Unity性能优化 Unity性能优化是指在游戏开发中提高游戏性能的过程,包括优化CPU和GPU的使用,以提高游戏的帧率和画质。下面是 Unity性能优化的相关知识点: 1. Unity性能调试工具及使用方法 Unity提供了多种...

    unity性能优化(pdf).rar

    10. **平台适配**:不同平台的性能特性各异,优化时需要考虑目标平台,如移动设备可能需要更严格的内存管理和更低的Draw Call。 综上所述,Unity性能优化涉及多个层面,从资源管理到代码优化,再到引擎特性的充分...

    Unity的Mask组件DrawCall优化《资源包》

    对Unity的Mask组件在一定环境下的优化、扩展方案,原生Mask组件会打断batch,一个Mask组件至少会产生额外2个DC,通过优化后,不会打断batch,大量的降低了DC,但同时也具有一定的局限性

    Unity3D降低DrawCall的插件!MeshBaker!

    Unity3D降低DrawCall的插件!MeshBaker!

    Unity DrawCall合并

    "Unity DrawCall合并"主要涉及以下知识点: 1. **修改Mesh UV**: UV坐标是用于映射纹理到3D模型上的二维坐标系统。通过合理地规划和修改Mesh的UV布局,可以实现多物体共用同一纹理,从而减少每个物体独立加载纹理...

    Pro Draw Call Optimizer 4.1

    Pro draw call is an editor extension that will easily reduce your draw calls by creating atlases for your models so they can share materials for static/dynamic batching. Custom shaders?, no worries, ...

    Unity场景优化和A星寻路

    因此,优化 DrawCall 是 Unity 场景优化的关键。 优化策略 1. 合并小 DrawCall:将多个小 DrawCall 合并成一个大 DrawCall,减少 DrawCall 的次数。 2. 使用图集(Atlas):使用图集可以减少 DrawCall 次数,因为...

    unity性能优化

    对于纹理导入,启用Generate Mipmaps选项可以有效减少纹理在渲染时的像素数量,优化性能。音频文件的采样率适当降低,可以减少音频数据的大小,节约内存和存储空间。 在内存优化方面,需要特别注意避免不必要的内存...

    Unity 性能优化(2021版)

    提高这一数字有助于优化性能。 - **Tris(三角形数量)**:当前摄像机视锥体范围内三角形的数量。三角形数量过多会影响渲染速度。 - **Verts(顶点数量)**:当前摄像机视锥体内网格顶点的数量。顶点数量过多也会...

    Unity+NGUI性能优化方法总结

    Unity中的DrawCall是渲染性能的关键因素。相邻的DrawCall如果使用相同材质、贴图和shader,可以进行合并。然而,合并并非总是有益的,可能反而导致性能下降。因此,需要谨慎处理DrawCall合并,确保其带来的好处大于...

    Pro Draw Call Optimizer.rar

    总结,优化Draw Call是提升Unity游戏性能的关键步骤。通过理解Draw Call的工作原理,结合使用如"Pro Draw Call Optimizer"这样的专业工具,以及采取一系列优化策略,开发者能够显著改善游戏的运行效率,为玩家带来...

    Unity UGUI 性能优化 示例工程

    10. **监控Profiler**:Unity的Profiler工具是性能优化的关键,通过分析Draw Call、CPU使用率和内存分配等数据,可以定位性能瓶颈并进行针对性优化。 `UGUI_BatchDemo`示例工程应该包含了一系列的场景和脚本,演示...

    【Unity模型优化插件】Mesh Baker 通过将多个网格、材质和贴图合并为单一网格,大幅减少 Draw Call次数

    LOD 支持:与 LOD 系统兼容,可以在不同视距下自动调整细节,进一步优化性能。 材质合并: 材质整合:支持将多个材质合并为一个,减少材质切换次数,从而降低 GPU 负荷。 贴图集生成:自动生成包含多材质的贴图集...

    Unity3D性能优化——渲染篇1

    Unity3D性能优化的渲染篇主要关注如何提升游戏在GPU层面的运行效率,因为渲染是图形处理的关键环节,直接影响游戏的帧率和整体性能。在Unity中,每一帧的渲染涉及CPU和GPU的协同工作,具体流程包括物体检查、渲染...

    Unity3D教程:Unity3D中网格合并示例2

    总结来说,Unity3D中的网格合并是优化场景性能的重要手段,特别是在处理复杂的角色模型或地形时。理解网格、材质、骨骼和子网格之间的关系以及如何正确地使用`CombineMeshes`函数,是实现这一技术的关键。通过合理地...

    Unity全面优化1

    DrawCall是Unity在渲染每一帧时对GPU发送的指令,过多的DrawCall会导致CPU负担过重,影响游戏性能。Unity提供了两种批处理技术来优化DrawCall:静态批处理(Static Batching)和动态批处理(Dynamic Batching)。 ...

    unity大场景优化

    本文将深入探讨Unity引擎在处理大型场景时所面临的问题以及相应的优化策略,帮助开发者提升游戏性能,降低资源消耗。 一、场景管理优化 1. 分区管理:大场景可以被划分为多个小区域,每个区域加载和卸载独立,减少...

    Draw Call Minimizer

    Draw Call Minimizer贴图优化,Unity 引擎游戏优化,整合贴图。

    Unity最全性能优化参考手册.pdf

    Unity提供了多种方法来降低DrawCall的数量: - **批量绘制**:通过合并相似的网格和材质来减少DrawCall的数量。 - **LOD (Level of Detail)**:根据不同距离显示不同精细程度的模型。 - **动态批处理**:Unity自动...

Global site tag (gtag.js) - Google Analytics