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

DrawCall优化

 
阅读更多

            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
如果是有超级多的人,可考虑使用顶点动画提高性能。
分享到:
评论

相关推荐

    Unity3D教程:DrawCall优化1

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

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

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

    Pro Draw Call Optimizer.rar

    《Unity中的Draw Call优化策略详解》 在3D游戏开发中,Unity引擎因其易用性和高效性被广泛应用。然而,随着场景复杂度的增加,Draw Call(绘制调用)的数量也会急剧上升,这可能导致性能瓶颈,影响游戏运行效率。...

    王哲:Cocos2D游戏性能优化

    Cocos2D这款用于开发2D游戏的开发框架以及由其衍生的Cocos2D-X跨平台开发框架和众多分支,正在帮助越来越多的开发者实现高效稳定...作为Cocos2D-X核心开发者,王哲将分享优化Cocos2D-X、Cocos2D-HTML5游戏性能的案例。

    Unity3D降低DrawCall的插件!MeshBaker!

    Unity3D降低DrawCall的插件!MeshBaker!

    uinty3d SkinnedMeshRenderer batches 优化,模型合并网格贴图

    SkinnedMeshRenderer 模型贴图网格分块过多,导致 batches过大,影响程序运行,通过将单个模型的网格贴图合并达到优化效果 详解:https://blog.csdn.net/weixin_41843959/article/details/80500930

    Unity DrawCall合并

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

    【cocos creator】ts滑动列表优化,复用预制体,减少drawcall

    本教程将详细介绍如何通过使用TypeScript(TS)进行滑动列表的优化,特别是复用预制体(Prefab)和减少Draw Call,以提升游戏性能。 首先,了解Draw Call是什么至关重要。Draw Call是指GPU绘制一次图形操作的命令,...

    Draw Call Minimizer

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

    UGUI优化技巧

    1. Drawcall优化:Drawcall指的是CPU向GPU发送的渲染命令,它决定了渲染过程中CPU要处理的工作量。优化Drawcall可以直接减少CPU的负担,提高游戏的渲染效率。关键的优化策略包括: - 确保不同材质的UI元素之间不...

    untiy中的优化技术

    **Draw Call优化**: Draw Call是CPU的瓶颈之一,因为它涉及大量数据准备和设置。当场景中的每个物体都有独特的材质和着色器时,CPU需要频繁地切换这些设置,导致大量Draw Calls。减少Draw Call的方法包括: 1. **...

    MeshBaker 3.13.1

    网格合并与Draw Call优化** MeshBaker的核心功能在于其网格合并技术。它能够将多个小的、独立的网格对象合并成一个大的复合网格,这样在渲染时只需一次绘制调用,而不是每个单独的网格对象都需要一次。这种技术...

    cocoscreator中scrollview降低drawcall

    cocoscreator中优化drawcall的scrollview

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

    Mesh Baker 是一款用于优化 Unity 中 3D 模型的插件,通过将多个网格、材质和贴图合并为单一网格,大幅减少 Draw Call(绘制调用)次数,从而提高游戏的运行性能。它非常适用于需要处理大量模型或材质的场景,如复杂...

    Mesh Baker v3.26.0最新版本 2.zip

    1. **Draw Call优化**: Draw Call是Unity在渲染过程中调用显卡绘制模型的次数,过多的Draw Call会导致频繁的上下文切换,降低渲染速度。Mesh Baker通过合并Mesh,减少Draw Call,从而优化了渲染流程,提高了游戏...

    Draw Call Optimizer - Just One Click 2.7.2

    Draw Call Optimizer可以帮助您大幅减少场景中使用的Draw Call,并在不损失大量视觉质量的情况下大幅提高FPS。只需单击一下即可提高您的场景性能! 这是通过组合多种技术来实现的,如网格组合和纹理图谱映射。 特点 ...

    Draw Call minimizer

    unity绘制指令优化,通过整合贴图集来优化绘制速度

    U3DNGUI.pdf

    使用Sprite相对于使用TextureAtlas,可以让DrawCall优化得更好,因为少的DrawCall数量是性能优化的一个重要指标。 ### NGUI中的UIButton组件 UIButton组件是NGUI中制作交互按钮的核心组件,它默认可以接受点击事件...

    Unity场景优化和A星寻路

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

    Unity界面插件NGUI基础教程

    - UIPanel脚本,作为容器,管理子对象的组合和DrawCall优化。 接下来,我们将创建UI控件: 1. 使用“NGUI”菜单的“Create a Widget”创建基本控件,如Sprite、Button等。 2. 选择Atlas和字体,这些会在后续的...

Global site tag (gtag.js) - Google Analytics