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 值过大所引起的卡的问题我所做的优化方式有:1.对于模型:Mesh 合并,有个不错的插件(DrawCall Minimizer --->
对Unity的Mask组件在一定环境下的优化、扩展方案,原生Mask组件会打断batch,一个Mask组件至少会产生额外2个DC,通过优化后,不会打断batch,大量的降低了DC,但同时也具有一定的局限性
Unity3D降低DrawCall的插件!MeshBaker!
Unity+NGUI性能优化方法总结---优化 资源分离打包与加载是最有效的减小安装包体积与运行时内存占用的手段。一般打包粒度越细,这两个指标就越小;而且当两个renderQueue相邻的DrawCall使用了相同的贴图、材质和...
我通过一个例子,将三个带有不同颜色 RGB的立方体,合并Mesh和材质到Character这一个GameObject中。这样原本对3个GameObject的操作只需要对Character这一个GameObject进行操作就好了。但是我们的任务还没有完成。
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, ...
Draw Call Minimizer贴图优化,Unity 引擎游戏优化,整合贴图。
二、网格和材质的对应关系一张实际的网格只能施加一个材质 三、合并网格(CombineMeshes)函数的第二个参数是设置是否将多个子网格合并成一张实际的网格 四
1.修改Mesh UV 2.GPU Instancing qazxswedcvfrtgbtgbnhyujm,ki
draw call产生原因及优化方式,静态,动态批处理,Texture Atlasing-纹理合并,骨骼合并,减少实时光照和实时阴影,NGUI中UI元素的深度。 附带工程源码,在unity中打开直观体验
优化降低drawcalls合并材质.zip模型资源unity模型资源下载优化降低drawcalls合并材质.zip模型资源unity模型资源下载优化降低drawcalls合并材质.zip模型资源unity模型资源下载 1.合个人学习技术做项目参考 2.适合学生...
unity绘制指令优化,通过整合贴图集来优化绘制速度
Pro Draw Call Optimizer.rar
SkinnedMeshRenderer 模型贴图网格分块过多,导致 batches过大,影响程序运行,通过将单个模型的网格贴图合并达到优化效果 详解:https://blog.csdn.net/weixin_41843959/article/details/80500930
DrawCall和NGUI一样都为1, 解决了NGUI做战斗冒血,冒伤害等文字性能太差。确实如此,我之前(NGUI 3.8.2,1000块的Android机器上)在Profile中也发现UIPanel占用CPU奇高。
TextMeshPro beta2.0可以在Unity5.1可以使用的聊天表情系统 TextMeshPro beta2.0可以在Unity5.1可以使用的聊天表情系统
超休闲3d小游戏,要求在低端机能跑起来,所以就要做深度优化,降低DrawCall,现在的Shader可以减少GPU渲染负担
Unity3D 合并材质 动态生成网格 减少DrawCall
unity优化 降低 drawcalls 合并 材质 Mesh Baker 2
Unity开发优化必备,DrawCall性能优化的必备工具,Mesh合并、Material合并、Texture合并等等