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次数才是王道,其它方面亦然。
分享到:
相关推荐
本教程将聚焦于DrawCall优化,这是提高Unity3D应用性能的关键一环。 DrawCall,即渲染调用,是GPU执行渲染命令的次数。当场景中有大量独立的绘制对象时,DrawCall的数量会显著增加。每个DrawCall都会引起GPU切换...
Unity性能优化 Unity性能优化是指在游戏开发中提高游戏性能的过程,包括优化CPU和GPU的使用,以提高游戏的帧率和画质。下面是 Unity性能优化的相关知识点: 1. Unity性能调试工具及使用方法 Unity提供了多种...
10. **平台适配**:不同平台的性能特性各异,优化时需要考虑目标平台,如移动设备可能需要更严格的内存管理和更低的Draw Call。 综上所述,Unity性能优化涉及多个层面,从资源管理到代码优化,再到引擎特性的充分...
对Unity的Mask组件在一定环境下的优化、扩展方案,原生Mask组件会打断batch,一个Mask组件至少会产生额外2个DC,通过优化后,不会打断batch,大量的降低了DC,但同时也具有一定的局限性
Unity3D降低DrawCall的插件!MeshBaker!
"Unity DrawCall合并"主要涉及以下知识点: 1. **修改Mesh UV**: UV坐标是用于映射纹理到3D模型上的二维坐标系统。通过合理地规划和修改Mesh的UV布局,可以实现多物体共用同一纹理,从而减少每个物体独立加载纹理...
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, ...
因此,优化 DrawCall 是 Unity 场景优化的关键。 优化策略 1. 合并小 DrawCall:将多个小 DrawCall 合并成一个大 DrawCall,减少 DrawCall 的次数。 2. 使用图集(Atlas):使用图集可以减少 DrawCall 次数,因为...
对于纹理导入,启用Generate Mipmaps选项可以有效减少纹理在渲染时的像素数量,优化性能。音频文件的采样率适当降低,可以减少音频数据的大小,节约内存和存储空间。 在内存优化方面,需要特别注意避免不必要的内存...
提高这一数字有助于优化性能。 - **Tris(三角形数量)**:当前摄像机视锥体范围内三角形的数量。三角形数量过多会影响渲染速度。 - **Verts(顶点数量)**:当前摄像机视锥体内网格顶点的数量。顶点数量过多也会...
Unity中的DrawCall是渲染性能的关键因素。相邻的DrawCall如果使用相同材质、贴图和shader,可以进行合并。然而,合并并非总是有益的,可能反而导致性能下降。因此,需要谨慎处理DrawCall合并,确保其带来的好处大于...
总结,优化Draw Call是提升Unity游戏性能的关键步骤。通过理解Draw Call的工作原理,结合使用如"Pro Draw Call Optimizer"这样的专业工具,以及采取一系列优化策略,开发者能够显著改善游戏的运行效率,为玩家带来...
10. **监控Profiler**:Unity的Profiler工具是性能优化的关键,通过分析Draw Call、CPU使用率和内存分配等数据,可以定位性能瓶颈并进行针对性优化。 `UGUI_BatchDemo`示例工程应该包含了一系列的场景和脚本,演示...
LOD 支持:与 LOD 系统兼容,可以在不同视距下自动调整细节,进一步优化性能。 材质合并: 材质整合:支持将多个材质合并为一个,减少材质切换次数,从而降低 GPU 负荷。 贴图集生成:自动生成包含多材质的贴图集...
Unity3D性能优化的渲染篇主要关注如何提升游戏在GPU层面的运行效率,因为渲染是图形处理的关键环节,直接影响游戏的帧率和整体性能。在Unity中,每一帧的渲染涉及CPU和GPU的协同工作,具体流程包括物体检查、渲染...
总结来说,Unity3D中的网格合并是优化场景性能的重要手段,特别是在处理复杂的角色模型或地形时。理解网格、材质、骨骼和子网格之间的关系以及如何正确地使用`CombineMeshes`函数,是实现这一技术的关键。通过合理地...
DrawCall是Unity在渲染每一帧时对GPU发送的指令,过多的DrawCall会导致CPU负担过重,影响游戏性能。Unity提供了两种批处理技术来优化DrawCall:静态批处理(Static Batching)和动态批处理(Dynamic Batching)。 ...
本文将深入探讨Unity引擎在处理大型场景时所面临的问题以及相应的优化策略,帮助开发者提升游戏性能,降低资源消耗。 一、场景管理优化 1. 分区管理:大场景可以被划分为多个小区域,每个区域加载和卸载独立,减少...
Draw Call Minimizer贴图优化,Unity 引擎游戏优化,整合贴图。
Unity提供了多种方法来降低DrawCall的数量: - **批量绘制**:通过合并相似的网格和材质来减少DrawCall的数量。 - **LOD (Level of Detail)**:根据不同距离显示不同精细程度的模型。 - **动态批处理**:Unity自动...