`

unity项目优化--绘制调用批处理unity3d Draw Call Batching

 
阅读更多
在屏幕上渲染物体,引擎需要发出一个绘制调用来访问图形API(iOS系统中为OpenGL ES)。每个绘制调用需要进行大量的工作来访问图形API,从而导致了CPU方面显著的性能开销。
Unity在运行时可以将一些物体进行合并,从而用一个绘制调用来渲染他们。这一操作,我们称之为“批处理”。一般来说,Unity批处理的物体越多,你就会得到越好的渲染性能。
Unity中内建的批处理机制所达到的效果要明显强于使用几何建模工具(或使用Standard Assets包中的CombineChildren脚本)的批处理效果。这是因为,Unity引擎的批处理操作是在物体的可视裁剪操作之后进行的。Unity先对每个物体进行裁剪,然后再进行批处理,这样可以使渲染的几何总量在批处理前后保持不变。但是,使用几何建模工具来拼合物体,会妨碍引擎对其进行有效的裁剪操作,从而导致引擎需要渲染更多的几何面片。

材质
只有拥有相同材质的物体才可以进行批处理。因此,如果你想要得到良好的批处理效果,你需要在程序中尽可能地复用材质和物体。
如果你的两个材质仅仅是纹理不同,那么你可以通过 纹理拼合 操作来将这两张纹理拼合成一张大的纹理。一旦纹理拼合在一起,你就可以使用这个单一材质来替代之前的两个材质了。
如果你需要通过脚本来访问复用材质属性,那么值得注意的是改变Renderer.material将会造成一份材质的拷贝。因此,你应该使用Renderer.sharedMaterial来保证材质的共享状态。
动态批处理

如果动态物体共用着相同的材质,那么Unity会自动对这些物体进行批处理。
动态批处理操作是自动完成的,并不需要你进行额外的操作。
Tips:
提醒:
1、 批处理动态物体需要在每个顶点上进行一定的开销,所以动态批处理仅支持小于900顶点的网格物体。
2、 如果你的着色器使用顶点位置,法线和UV值三种属性,那么你只能批处理300顶点以下的物体;如果你的着色器需要使用顶点位置,法线,UV0,UV1和切向量,那你只
能批处理180顶点以下的物体。
请注意:属性数量的限制可能会在将来进行改变。
4、 不要使用缩放尺度(scale)。分别拥有缩放尺度(1,1,1)和(2,2,2)的两个物体将不会进行批处理。
5、 统一缩放尺度的物体不会与非统一缩放尺度的物体进行批处理。
使用缩放尺度(1,1,1)和 (1,2,1)的两个物体将不会进行批处理,但是使用缩放尺度(1,2,1)和(1,3,1)的两个物体将可以进行批处理。
6、 使用不同材质的实例化物体(instance)将会导致批处理失败。
7、拥有lightmap的物体含有额外(隐藏)的材质属性,比如:lightmap的偏移和缩放系数等。所以,拥有lightmap的物体将不会进行批处理(除非他们指向lightmap的同一部分)。
8、 多通道的shader会妨碍批处理操作。比如,几乎unity中所有的着色器在前向渲染中都支持多个光源,并为它们有效地开辟多个通道。
9、预设体的实例会自动地使用相同的网格模型和材质。

静态批处理

相对而言,静态批处理操作允许引擎对任意大小的几何物体进行批处理操作来降低绘制调用(只要这些物体不移动,并且拥有相同的材质)。因此,静态批处理比动态批处理更加有效,你应该尽量低使用它,因为它需要更少的CPU开销。

为了更好地使用静态批处理,你需要明确指出哪些物体是静止的,并且在游戏中永远不会移动、旋转和缩放。想完成这一步,你只需要在检测器(Inspector)中将Static复选框打勾即可,如下图所示:
unity3d Draw Call Batching (绘制调用批处理) - 重庆unity3d - unity3d工作室
使用静态批处理操作需要额外的内存开销来储存合并后的几何数据。在静态批处理之前,如果一些物体共用了同样的几何数据,那么引擎会在编辑以及运行状态对每个物体创建一个几何数据的备份。这并不总是一个好的想法,因为有时候,你将不得不牺牲一点渲染性能来防止一些物体的静态批处理,从而保持较少的内存开销。比如,将浓密森里中树设为Static,会导致严重的内存开销。
静态批处理目前只支持Unity iOS Advanced。
分享到:
评论

相关推荐

    Unity3D教程:DrawCall优化1

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

    Unity性能优化.pptx

    Drawcalls是指游戏中的绘制调用,Skinning是指游戏中的骨骼动画,Batching是指游戏中的批处理。减少这些操作可以提高游戏的性能。 4. GPU相关优化 GPU相关优化包括优化Shader、Post Processing等操作,以减少GPU的...

    在Unity中使用实例化在1个绘制调用中渲染敌人健康条的示例项目-C#-ShaderLab-下载

    这个名为“UnityInstancedHealthBars”的示例项目展示了如何使用Unity的实例化(Instancing)技术来优化敌人的健康条渲染,使得所有敌人的健康条能在一次绘制调用(Draw Call)中完成,从而降低性能开销。...

    Pro Draw Call Optimizer.rar

    然而,随着场景复杂度的增加,Draw Call(绘制调用)的数量也会急剧上升,这可能导致性能瓶颈,影响游戏运行效率。本文将深入探讨"Pro Draw Call Optimizer"这一工具,并解析如何在Unity中有效地进行Draw Call优化。...

    Unity 性能优化(2021版)

    - **Batches(绘制批次)**:表示处理的绘制调用(Draw Call)批次的总数。过多的Draw Calls会导致性能下降,可以通过合批技术来优化。 - **Saved by batching**:表示被合并到批次中的绘制调用数量。提高这一数字...

    Unity UGUI 性能优化 示例工程

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

    unity优化文档

    在Unity3D项目优化方面,涉及到的技术和知识点非常多,以下针对Unity优化文档中的核心内容,进行详细解读。 ### 遮挡剔除 遮挡剔除是一种性能优化技术,它的工作原理是当一个物体被其他物体遮挡而不在摄像机的可视...

    移动游戏GPU性能优化

    - DrawCall(绘制调用)是CPU告诉GPU开始渲染物体的指令。每个DrawCall都包含渲染一组物体所需的所有状态信息。在移动平台上,过多的DrawCall会直接影响性能,因此必须降低DrawCall的数量。 - SetPassCall是Draw...

    Unity开发.docx

    - **减少Draw Call**: 使用批处理(batching)技术合并多个网格的绘制调用。 **3. UI/UX设计** - **GUI系统**: Unity提供了一套完整的GUI系统,可以创建自定义的用户界面。 - **用户体验**: 设计简洁明了的界面,使...

    Easy Combine.rar

    批处理允许Unity在同一时间内渲染多个具有相同材质的物体,减少了绘制调用(Draw Call),从而提升了游戏性能。通过将多个小的物体合并成一个大的对象,Unity可以一次性处理它们,减少GPU的负担,这对于移动设备或者...

    Hud,血条,飘字,欢迎下载 赖..

    在Unity中,多个游戏对象共享同一材质时,Unity可以合并这些绘制调用以提高性能。然而,复杂的UI布局可能导致大量的DrawCall,因为每个独立的UI元素都可能有自己的材质。为优化性能,开发者需要关注DrawCall的管理,...

    NGUI UIScrollView 性能优化

    1. **减少Draw Call**:Draw Call是Unity渲染过程中调用显卡绘制每个物体的命令。过多的Draw Call会导致性能下降。可以通过合并精灵(Sprite Atlas)和使用同一材质来减少Draw Call。对于ScrollView中的元素,尽量...

    AnimationInstancing群体渲染

    4. **优化Draw Call**: Unity的Batching技术可以进一步合并相似的渲染对象,减少Draw Call数量。当多个角色使用相同的动画和材质时,它们可能被批处理为一次绘制操作,这极大地提高了渲染效率。 5. **实现细节差异...

    水果忍者完整源码-刀光特效全有

    为了在移动设备上提供流畅的游戏体验,源码中会有针对性的性能优化措施,如减少draw call(绘制调用)、使用batching(批次渲染)技术、适当降低纹理分辨率等。 八、调试与版本控制 作为完整的源码,项目很可能包含...

Global site tag (gtag.js) - Google Analytics