DrawCall优化
一 Mesh Renderer
二 Skinned Mesh Renderer
三 合并要求对比
四 总结
五 场景制作建议
DrawCall优化合并,也叫批处理,即DrawCall Batching. 通过减少Draw call数提高性能。
一 Mesh Renderer
分为Dynamic Batching和 Static Batching
Dynamic Batching
不需要任何操作,只要共享材质(即使是不同的Mesh模型也可以),就会自动被合并。可以自由移动旋转。但有以下使用要求:
(1)单个Mesh的vertex attribute总数不超过900.
即 vertex* attributeCount < 900
例如一个Mesh有pos,uv,normal,那么attributeCount为3,
也就是顶点数量不超过300个。
(2)游戏对象使用相同模型和材质时,只有相同缩放(即xyz等比缩放,浮点尾数可以有细微差)的会被合并。
如
(1,1,1)与(1,1,1)
(2,2,2)与(2,2,2)
(0.5,0.5,0.5)与 (0.5,0.5,0.5)
(2,2,2)与(2,2,2.0001)
(3)场景烘焙:烘焙后同材质将不会被烘焙。lightmap 有隐藏的材质参数:offset/scale, 所以使用lightmap的物体不会被合并
(4)Shader不能使用多Pass:多Pass的Shader会破坏Dynamic Batching
Static Batching
原理:
运行游戏后将一组游戏对象的多个模型会被动态合并为1个。这组游戏对象所有使用同一材质的在一个DrawCall来完成。这些游戏对象运行后无法移动缩放旋转。但是Drawcall一定是最大化合并的,并且不受动态合并的诸多限制(见下文详述)。
注意:即使物体都使用了同样的模型,在batch后每一个物体都会创建一份模型对应的geometry,在新的Combined Mesh里。所以过多的batch会增加内存占用。例如场景里的树群就不适合Static Batch,而适合动态合并。
实现方法:
(1)MeshRenderer勾选Batching Static: 勾了即可
(2)代码中使用UnityEngine.StaticBatchingUtility实现(可以在任何平台调用):
1)将所有要合并的静态物体(不须勾Batching Static)放入统一一个root
2)StaticBatchingUtility.Combine(root);
之后就合并好了!
区别:
勾选Batching Static:
完全自动合并,在MeshFilter里显示的是 Combined Mesh(root:scene)。合并后不能移动
StaticBatchingUtility:
合并到一个游戏对象下。合并后可以移动父节点游戏对象
二 Skinned Mesh Renderer
Unity对Skinned Mesh Renderer没有任何batching, 但插件Mesh Baker可以对Skinned Mesh进行合并。
注意:
(1)修改Renderer.material将会创建一份新的material,应使用Renderer.sharedMaterial来保持材质公用。
(2)可以使用Mesh.Optimize() 优化模型。导入模型不需要调用此接口,在导入模型至Unity3d时已自动处理。
代码创建的模型有可能需要调用此接口来优化。
三 合并要求对比
要求 动态 静态
1 只能是MeshRenderer不能是SkinnedMeshRenderer 要求 要求
2 Shader必须是单Pass 要求 不要求
3 不能被场景烘焙(不能标注为Light map static) 要求 不要求
4 网格模型文件总点数要求 要求 不要求
5 网格模型单个文件点数要求 要求 不要求
6 限制缩放 要求 不要求
7 限制位移旋转 不要求 要求
另外Unity中任何Mesh的面 有65536的面数限制
四 总结
三种方式:
1 动态合并
优点:
内存消耗小
可以自由位移旋转
缺点:
要求众多()
2 标记Light map static合并
优点:
最方便快捷,要求最少
缺点:
完全不能移动
内存有消耗
只能处理在Scene中默认放置的物体
3 代码StaticBatchingUtility合并
优点:
方便快捷,要求少
可整体移动
可处理代码动态加载的场景或物体
缺点:
内存有消耗
代码合并是要求最少的,并可以整体移动。而动态合并可以移动旋转,并做Animation动画。故推荐StaticBatchingUtility + 动态合并。
五 场景制作建议
美术人员在制作某场景时,尽量:
静态物体:使用静态合并
条件
1 用Mesh Renderer,也就是不绑定骨骼
2 不是Wrap循环UV的贴图,尽量合并到一张大图集
方法
标注Batching Static即可
动态物体:使用动态合并,动画可以用Unity的动画去做
条件
1 无骨骼
2 不参与场景烘焙
3 相同物体相同缩放
4 单个Mesh的vertex attribute总数不超过900.
5 Shader单Pass
方法
满足条件Unity自动优化
(不满足动态合并要求的。场景动画可以用骨骼动画去做。但应尽量避免或者少的使用这种方式。因为没有Drawcall优化效率较低)
PS:
要关闭动态合并在subshader里加以下代码即可
Tags { "DisableBatching" = "true" }
如果是非Mobile端可以考虑使用GPU Instancing
如果是有超级多的人,可考虑使用顶点动画提高性能。
分享到:
相关推荐
本教程将聚焦于DrawCall优化,这是提高Unity3D应用性能的关键一环。 DrawCall,即渲染调用,是GPU执行渲染命令的次数。当场景中有大量独立的绘制对象时,DrawCall的数量会显著增加。每个DrawCall都会引起GPU切换...
对Unity的Mask组件在一定环境下的优化、扩展方案,原生Mask组件会打断batch,一个Mask组件至少会产生额外2个DC,通过优化后,不会打断batch,大量的降低了DC,但同时也具有一定的局限性
《Unity中的Draw Call优化策略详解》 在3D游戏开发中,Unity引擎因其易用性和高效性被广泛应用。然而,随着场景复杂度的增加,Draw Call(绘制调用)的数量也会急剧上升,这可能导致性能瓶颈,影响游戏运行效率。...
Cocos2D这款用于开发2D游戏的开发框架以及由其衍生的Cocos2D-X跨平台开发框架和众多分支,正在帮助越来越多的开发者实现高效稳定...作为Cocos2D-X核心开发者,王哲将分享优化Cocos2D-X、Cocos2D-HTML5游戏性能的案例。
Unity3D降低DrawCall的插件!MeshBaker!
SkinnedMeshRenderer 模型贴图网格分块过多,导致 batches过大,影响程序运行,通过将单个模型的网格贴图合并达到优化效果 详解:https://blog.csdn.net/weixin_41843959/article/details/80500930
"Unity DrawCall合并"主要涉及以下知识点: 1. **修改Mesh UV**: UV坐标是用于映射纹理到3D模型上的二维坐标系统。通过合理地规划和修改Mesh的UV布局,可以实现多物体共用同一纹理,从而减少每个物体独立加载纹理...
本教程将详细介绍如何通过使用TypeScript(TS)进行滑动列表的优化,特别是复用预制体(Prefab)和减少Draw Call,以提升游戏性能。 首先,了解Draw Call是什么至关重要。Draw Call是指GPU绘制一次图形操作的命令,...
Draw Call Minimizer贴图优化,Unity 引擎游戏优化,整合贴图。
1. Drawcall优化:Drawcall指的是CPU向GPU发送的渲染命令,它决定了渲染过程中CPU要处理的工作量。优化Drawcall可以直接减少CPU的负担,提高游戏的渲染效率。关键的优化策略包括: - 确保不同材质的UI元素之间不...
**Draw Call优化**: Draw Call是CPU的瓶颈之一,因为它涉及大量数据准备和设置。当场景中的每个物体都有独特的材质和着色器时,CPU需要频繁地切换这些设置,导致大量Draw Calls。减少Draw Call的方法包括: 1. **...
网格合并与Draw Call优化** MeshBaker的核心功能在于其网格合并技术。它能够将多个小的、独立的网格对象合并成一个大的复合网格,这样在渲染时只需一次绘制调用,而不是每个单独的网格对象都需要一次。这种技术...
cocoscreator中优化drawcall的scrollview
Mesh Baker 是一款用于优化 Unity 中 3D 模型的插件,通过将多个网格、材质和贴图合并为单一网格,大幅减少 Draw Call(绘制调用)次数,从而提高游戏的运行性能。它非常适用于需要处理大量模型或材质的场景,如复杂...
1. **Draw Call优化**: Draw Call是Unity在渲染过程中调用显卡绘制模型的次数,过多的Draw Call会导致频繁的上下文切换,降低渲染速度。Mesh Baker通过合并Mesh,减少Draw Call,从而优化了渲染流程,提高了游戏...
Draw Call Optimizer可以帮助您大幅减少场景中使用的Draw Call,并在不损失大量视觉质量的情况下大幅提高FPS。只需单击一下即可提高您的场景性能! 这是通过组合多种技术来实现的,如网格组合和纹理图谱映射。 特点 ...
unity绘制指令优化,通过整合贴图集来优化绘制速度
使用Sprite相对于使用TextureAtlas,可以让DrawCall优化得更好,因为少的DrawCall数量是性能优化的一个重要指标。 ### NGUI中的UIButton组件 UIButton组件是NGUI中制作交互按钮的核心组件,它默认可以接受点击事件...
因此,优化 DrawCall 是 Unity 场景优化的关键。 优化策略 1. 合并小 DrawCall:将多个小 DrawCall 合并成一个大 DrawCall,减少 DrawCall 的次数。 2. 使用图集(Atlas):使用图集可以减少 DrawCall 次数,因为...
- UIPanel脚本,作为容器,管理子对象的组合和DrawCall优化。 接下来,我们将创建UI控件: 1. 使用“NGUI”菜单的“Create a Widget”创建基本控件,如Sprite、Button等。 2. 选择Atlas和字体,这些会在后续的...