关于Unity四种合批技术详解

文章目录

  • 一.静态合批(StaticBatching)
      • 1.启用静态合批
      • 2.举例说明
      • 3.静态合批的限制
      • 4.静态合批的优点缺点
      • 5.动态指定物品合批
  • 二.动态合批(Dynamic Batching)
      • 1.启用动态合批
      • 2.合批规则
      • 3.举例说明
      • 4.使用限制
  • 三.GPU Instancing
      • 1.启用GPU Instancing
      • 2.启用限制
      • 3.举例说明
  • 四.SRP Batcher
      • 1.兼容性
      • 2.工作原理
      • 3.开启SRP Batcher
      • 4.例子
  • 五.总结
      • 1.优先级
      • 2.四种合批的区别
      • 3.合批失败信息汇总

Unity中Batching大致可以分为StaticBatching(静态合批),DynamicBatching(动态合批),SRPBatching与GPUInstancing四大类,
这里记录一下这几种拿批的细节


一.静态合批(StaticBatching)

静态合批是Unity的一种优化技术, 本质是将相同材质并且始终不动的的Mesh合并成为一个大Mesh
然后由CPU合并为一个批次发送给GPU处理,从而减少DrawCall带来的消耗.

1.启用静态合批

可以通过 Project Settings > Player > Other Settings > Static Batching 开启动态合批
在这里插入图片描述

选中在场景中物体后在Inspector面板中勾选Static
在这里插入图片描述

Unity会将场景中所有的Mesh合并成一个Mesh,但总顶点数不超过2的16次幂

2.举例说明

当前场景中创建4个圆柱体时场景中的DrawCall是5.
在这里插入图片描述

我们勾选场景中的静态选项时
在这里插入图片描述

可以现发Draw减少到了2
在这里插入图片描述

将基中两个改为材质B,会发现DrawCall增加到3
在这里插入图片描述

3.静态合批的限制

单次合批最多可以合并64000个顶点,所以需要静态合批的物体需要有网格且处于激活状态.网格读写需要是开启的.
然后Unity会在各个MeshFilter组件中收集Mesh将其合并.
我们可以通过打开Windows > Analysis > Frame Debugger 查看静态合批详细内容
在这里插入图片描述

4.静态合批的优点缺点

1):优点
__可以优化DrawCall
__可能使用使用光照贴图
2):缺点
__因为有合并网格的操作所以性能开销会变大
__静态物品不得合批旋转等

5.动态指定物品合批

在满足以条件的情况下,可以使用以下API动态设置批处理
在这里插入图片描述


二.动态合批(Dynamic Batching)

与静态拿批不同,动态合批是的物体是可以运动的,但是需要符合Unity内部执行的步骤,我们需要其规则去开发.

1.启用动态合批

可以通过 Project Settings > Player > Other Settings > Dynamic Batching 开启动态合批
在这里插入图片描述

2.合批规则

1): 需要使用相关的材质
2): 支持不同Mesh网格之间的合批
3): 单个网个最多支持225个顶点,未来可能会调整.

3.举例说明

1): 例子如图我们创建了一球体使用材质A,以发现只用了了一个Batches:(场景默认用了1个)
在这里插入图片描述

2): 复制多个,下显示为7 合批失败.
在这里插入图片描述

3): 为什么呢,因为球体的点数是远超过225个顶点的
在这里插入图片描述

4): 当我们使用球体在相同材质下不段创建时,会发现Batch将不断上升
在这里插入图片描述

5): 当我们将球体Mesh换成圆柱体(88个顶点)时发现,合批成功了
在这里插入图片描述

6): 当我们使用圆柱体在相同材质下不段创建时,会发现Batch将没有变化
在这里插入图片描述

7): 当我们在上面动态创建的基础上再去修修改材质参数时,合批也将会被打断
在这里插入图片描述

8): 当我们使用的Shader中存在多个Pass时也会导致合批失败
在这里插入图片描述

9):当场景中只有一个灯光时可以成功合批
在这里插入图片描述

当场景中存在多个灯光如图(红色绿色)时,合批将会被打断
在这里插入图片描述

10).我们可以通过打开Windows > Analysis > Frame Debugger 查看合批详细内容
在这里插入图片描述

11): 在此可以查看合批失败的原因
在这里插入图片描述

4.使用限制

1): 拿批Mesh点数不超过225
2): 不同Mesh相同材质可以合批
3): 相同材质复制出来的材质实例不能合批(修改实例中材质参数会自动创建材质实例)
4): 照片贴图材质必须使用相同光照贴图位置
5): 采用具有多个Pass的Shader将无法合批
6): 合批成功的对像只受一个光照影响
7): 延迟渲染不支持动态合批操作
8): 收集合批信息将加大CPU负担


三.GPU Instancing

GPU Instancing也是Unity提供的一种优化方案,其本质是使用一个DrawCall渲染多个相同材质的网格对像.
从而减少CPU和GPU的开销.比较适合场景中大量重复的物体如树木和草地等.

1.启用GPU Instancing

选择对像后在Inspector面板中勾选Enable GPU Instancing 即可以启用.
在这里插入图片描述

2.启用限制

1.会合并使用相同材质和Mesh的对象
2.材质需要支持GPU Instancing,例如默认标准材质就有
3.Tranform信息需要有所不同,(完全重合了渲染出来也没有意义)
4.未使用SRP Batcher,如有会优先使用SRP Batcher.(在URP渲染管线中是默认开启的)
5.粒子对像不能合批
6.使用MaterialPropertyBlocks的游戏不能合批
7.Shader必须是使用compatible的

3.举例说明

在场景中创建4个圆柱体使用标准材质
在这里插入图片描述

选择材质勾选Enable GPU Instancing 后再看,合批成功
在这里插入图片描述

可以通过打开Windows > Analysis > Frame Debugger 查看合批详细内容
在这里插入图片描述


四.SRP Batcher

SRP Batcher是Unity提供的一种渲染优化技术,它可以将多个网格合并成单个批次进行渲染,从而提高性能。
与其他合批不同,SRP Batcher将未改变属性的Mesh缓存起来,从而减少消耗

1.兼容性

1): 不支持内置渲染管线,支持通用(URP)/高清(HDRP)/自定义(SRP)渲染管线
2): 不使用MaterialPropertyBlocks.
3): 着色器必须兼容SRP Batcher

2.工作原理

在标准的渲染流程下,CPU需要收集所有场景物体的参数,场景中的材质越多CPU提交给GPU的数据就越多.
而在SRP中流程下GPU拥有数据管理的"生命权",管理大量不同材质但Shader变动较小的的内容
让数据在GPU中持久存在,从而减少消耗.

3.开启SRP Batcher

在Package Manager中导入Universal RP(通用渲染管线)
在这里插入图片描述

创建通用渲染管线
在这里插入图片描述

然后按以下步骤添加通用渲染管线
在这里插入图片描述

4.例子

在场景中创建四个圆柱体
在这里插入图片描述

运行后会发现已被SRP Batch合并,因为SRP默认是开启的
在这里插入图片描述

关闭SRP Batch选项
在这里插入图片描述

则会分成4个Bathc进行渲染

在这里插入图片描述


五.总结

1.优先级

1): 静态合批会优先使用,如果还兼容SRP Batcher则会同时使用
2): 动态物体会优先使用SRP Batcher
3): 非静态且不支持SRP Batcher才会检查启启用GPU Instancing
4): 以上都不支持才会使用Dynamic Batching
即: Static Batching > SRP Batcher > GPU Instancing > Dynamic Batching

2.四种合批的区别

Static BatchingDynamicBatchingGPUInstancingSRPBatching
原理离线合并网格运行时合并网格切换矩阵变换渲染相同物体使用大块常量缓冲区避免切换上下文
目的降低SetPass calls降低Drawcall降低Drawcall降低SetPass calls
优点限制少自动性能极好相同Shader不同材质加速
缺点加大包体,加大内容,要求同材质加大CPU消耗,对顶点与材质有要求要求相同物体只能用于SRP
要求相同Mesh
要求相同材质
要求相同Shader
要求Shader兼容
适用情形静态场景小物体,特效,UI动态大量相同物体较为广泛,特效和蒙皮网格除外

3.合批失败信息汇总

  1. “An object is affected by multiple forward lights.” 此物体受到多个前向灯光的影
  2. “Objects have different materials.” 此物体有不同的材质
  3. “An object is using a multi-pass shader.” 此物体使用了多pass着色器
  4. “An object has odd negative scaling.” 此物体Trasform的Scale使用了负数
  5. “Either objects have different \”Receive Shadows\“ settings, or some objects are within the shadow distance, while some other objects are not.” 此物体接收阴影的设置不同,或者物体有不同的的阴影距离设置
  6. “Objects are affected by different forward lights.” 此物体受到不同的前向灯光影响
  7. “Objects are on different lighting layers.” 物体在不同的Lighting Layer上
  8. “Objects have different \”Cast Shadows\“ settings.” 此物体有不同的投影体设置
  9. “Objects either have different shadow caster shaders, or have different shader properties / keywords that affect the output of the shadow caster pass.” 此物体有不同的投影着色器设置或者有不同的着色器属性或者关键字影响Shadow Caster Pass的输出
  10. “The shader explicitly disables batching with the \”DisableBatching\“ tag.” 着色器中显式设置了DisableBatching的标记
  11. “Objects have different MaterialPropertyBlock set.” 此物体有不同的MaterialPropertyBlock的属性集
  12. “Non-instanced properties set for instanced shader.” Instanced的着色器有非instanced属性集
  13. “Objects are lightmapped.” 物体使用了不同的LightMap或者虽然使用相同的LightMap但使用的UV不同
  14. “Objects are affected by different light probes.” 此物体受到不同的光照探针影响
  15. “Objects are shadowed by baked occlusions and have different occlusion factors.” 此物体烘焙了遮挡,并且设置了不同的遮挡因子
  16. “Objects are affected by different reflection probes.” 此物体受到不同的反射探针影响
  17. “Rendering different meshes or submeshes with GPU instancing.” 使用GPU实例化渲染不同的网格或子网格
  18. “Objects have different batching-static settings.” 此物体有不同的静态合批设置
  19. “Objects belong to different static batches.” 此物体归属不同的Static Batches
  20. "Dynamic Batching is turned off in the Player Settings or is disabled temporarily in the current context to avoid z-fighting.” 在Player Settings中关闭了动态合批,或者在当前的环境中为了避免深度冲突而临时关闭了合批
  21. “There are too many indices (more than 32k) in a dynamic batch.” 动态合批中有太多的索引(大于32k)
  22. “A mesh renderer has additional vertex streams. Dynamic batching doesn‘t support such mesh renderers.” Mesh Renderer具有其他顶点流。动态批处理不支持此类网格渲染器。
  23. “A submesh we are trying to dynamic-batch has more than 300 vertices.” 动态合批超过300个顶点
  24. “A submesh we are trying to dynamic-batch has more than 900 vertex attributes.” 动态合批超过900个顶点属性
  25. “This is the first draw call of a new shadow cascade.” 新阴影级联的第一次绘制调用
  26. “The material doesn‘t have GPU instancing enabled.” 材质未启用GPU Instancing功能
  27. “Objects are rendered using different rendering functions. This can happen if the type of renderer is different (eg Mesh/Skinned Mesh) or when using different settings within the same renderer, such as Sprite Masking.” 使用不同的渲染。如果渲染器的类型不同(例如网格/蒙皮网格),或者在同一渲染器中使用不同的设置(例如精灵遮罩),则可能会发生这种情况。
  28. “Objects have different batching keys. This is usually caused by using different vertex streams on Particle Systems, or by mixing Lines and Trails, or by mixing lit and unlit geometry.” 此对象具有不同的Batching Keys。 这通常是由于在粒子系统上使用不同的顶点流,或混合线和轨迹,或混合Lit和Unlit的几何体造成的。"
  29. “Mesh uses 32 bit index buffer.” Mesh使用了32位的索引缓冲
  30. “Submesh has non-zero base vertex.” 子网格对象有非0的基础顶点, submesh.BaseVertexLocation != 0
  31. “The previous instanced draw call has reached its maximum instance count.” 先前的InstanceDrawCall已经达到了Instance的最大数量
  32. “Motion Vector rendering doesn‘t support batching.” Motion Vector的渲染不支持Batching
  33. “When using late latching, children of an XR late latched GameObject do not use batching.” 使用late latching时,XR late latched GameObject的子级不能合批
  34. “Objects have different bounds and bounds instancing is disabled.” 对象具有不同的包裹体,那么包裹体实例化被禁用
  35. “SRP: Node have different shaders.” 节点具有不同的着色器
  36. “SRP: Node use multi-pass shader” 节点使用了多Pass着色器
  37. “SRP: Node use different shader keywords” 节点使用了不同的着色器关键字
  38. “SRP: End of the batch flush” Batch Flush结束
  39. “SRP: Node is not compatible with SRP batcher” 节点与SRP Batcher不兼容
  40. “SRP: Node material requires device state change” 节点材质需要改变渲染设备状态
  41. “SRP: First call from ScriptableRenderLoopJob” ScriptableRenderLoopJob第一次调用
  42. “SRP: This material has custom buffer override” 材质有自定义重写的Buffer

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1451317.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

使用Omnipeek进行Wifi/P2P抓包

前言 工作中解决Mirracast投屏连接失败的问题时,遇到了需要抓取wifi数据包的情况,记录一下配置和使用过程。 一、Omnipeek 的安装和配置 1.1 Omnipeek 安装 双击 setup.exe 进行安装 1.2 注册 注册时,版本写 71 ,产生序列号和…

【JVM】JVisualVM的介绍、使用和GC过程

VisualVM介绍 VisualVM 是Netbeans的profile子项目,已在JDK6.0 update 7 中自带,能够监控线程,内存情况,查看方法的CPU时间和内存中的对 象,已被GC的对象,反向查看分配的堆栈(如100个String对象分别由哪几…

陪诊小程序开发,陪诊师在线接单

近几年,陪诊师成为了一个新兴行业,在科技时代中,陪诊小程序作为互联网下的产物,为陪诊市场带来了更多的便利。 当下生活压力大,老龄化逐渐严重,年轻人很难做到陪同家属看病。此外,就诊中出现了…

无线领夹麦克风哪个品牌好?一文告诉你领夹无线麦克风哪个好!

​究竟该如何选择麦克风呢?又该如何挑选无线麦克呢?询问我关于麦克风选择问题的人着实不少。对于那些仅仅是想要简单地自我娱乐的朋友而言,着实没必要去折腾,直接使用手机自带的麦克风便可以了。但若是处于想要直播、拍摄短视频、…

Aigtek高压功率放大器在超声电机中的应用

超声电机是一种先进的电机技术,常用于各种应用,如医疗成像、工业自动化和汽车技术。这些电机在高速、高精度和低噪音要求的领域中表现出色。在驱动这些超声电机时,高压功率放大器发挥着关键作用。本文将介绍高压功率放大器如何驱动超声电机&a…

【Oracle生产运维】数据库服务器高负载排查处理

说明 在Oracle数据库运维工作中,经常会遇到Oracle数据库服务器平均负载(load average)突然异常升高,如果放任不管,严重的情况下会出现数据库宕机、服务器重启等重大故障。因此,当发现数据库服务器平均负载…

基于变分自动编码器VAE的电池剩余使用寿命RUL估计

加载模块 import math import itertools import numpy as np import pandas as pd import seaborn as sns import tensorflow as tf from keras import layers from sklearn.svm import SVR from tensorflow import keras from keras import backend as K import matplotlib.p…

期货到底难在哪里?

第一难:使用杠杠,杠杠放大的其实是你性格、天赋和技能上的弱点,同时相应缩小你这三个方面的优点;第二难:双向交易。如果只能做多,理论上你每次交易将有50%的概率盈利。现在既能做多又能做空,只剩…

centos7.9部署k8s的几种方式

文章目录 一、常见的k8s部署方式1、使用kubeadm工具部署2、基于二进制文件的部署方式3、云服务提供商的托管 Kubernetes 服务4、使用容器镜像部署或自动化部署工具 二、使用kubeadm工具部署1、硬件准备(虚拟主机)2、环境准备2.1、所有机器关闭防火墙2.2、…

二分+ST表+递推,Cf 1237D - Balanced Playlist

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 Problem - 1237D - Codeforces 二、解题报告 1、思路分析 case3提示我们一件事情:如果存在某个位置永远不停止,那么所有位置都满足永远不停止 很容易证明 随着下标右移&#xff0c…

欧式家居官网源码系统-轻奢大气设计风格

一款家居家私的官方网站系统,设计轻奢大气。 前端内容均可通过后台修改。当然你也可以用于其他行业的官网使用,只要你喜欢这个设计。 大致功能: 1、会员系统 2、支付功能 3、标签功能 4、熊掌号提交功能 5、文章发布功能 6、SEO设置功能 7、多…

U盘文件损坏且无法读取怎么修复?五个方法帮你搞定

在现代社会,U盘已经是我们日常生活和工作中不可缺少的工具之一。U盘的容量大、体积小、携带方便,很多人都喜欢使用U盘用于个人和工作数据的存储和传输。但是,U盘和其他的电子设备一样,在试用期间有时候会出现U盘打不开提示目录结构…

【触想智能】工业显示器的分类与应用领域分析

工业显示器作为智能制造的一种重要设备之一,已经被广泛应用于各种工业领域。根据应用场景和特定需求,工业显示器分为很多不同的种类,本文将从这些分类及其应用领域进行分析。 一、工业显示器分类 1、工业液晶显示器:工业液晶显示器…

Web应用安全测试-防护功能缺失

Web应用安全测试-防护功能缺失 1、Cookie属性问题 漏洞描述: Cookie属性缺乏相关的安全属性,如Secure属性、HttpOnly属性、Domain属性、Path属性、Expires属性等。 测试方法: 通过用web扫描工具进行对网站的扫描,如果存在相关…

生命在于学习——Python人工智能原理(3.3)

三、深度学习 4、激活函数 激活函数的主要作用是对神经元获得的输入进行非线性变换,以此反映神经元的非线性特性。常见的激活函数有线性激活函数、符号激活函数、Sigmod激活函数、双曲正切激活函数、高斯激活函数、ReLU激活函数。 (1)线性…

突破管理瓶颈:基于前端技术的全面预算编制系统解析

前言 在现代商业环境中,预测销售数据和实际成本是每个公司CEO和领导都极为重视的关键指标。然而,由于市场的不断变化,准确地预测和管理这些数据变得愈发具有挑战性。为了应对这一挑战,建立一个高效的系统来管理和审查销售数据的重…

Airtest 使用指南

Airtest 介绍 准备工作 AirtestIDE 安装与启动: https://airtest.doc.io.netease.com/IDEdocs/getting_started/AirtestIDE_install/ 电脑端的准备工作完成后,对于手机端只需要打开允许USB调试,当首次运行时会提示安装PocoService,同意即可。 界面介绍

华为 无线控制器 AirEngine9700-M1 AirEngine5760-51 AP供电降档问题

1 故障现象,一台Huawei Switch S5720-28TP-PWR-LI-AC poe交换机接入ap(5760-51) 20个,其中一个网口灯不亮,随机拔掉一个AP网线,之前不亮的网口,正常闪亮启动。 # AirEngine5760-51 满载功率28.8w Huawei Switch S5720-28TP-PWR-L…

基于Verilog表达的FSM状态机

基于Verilog表达的FSM状态机 1 FSM1.1 Intro1.2 Why FSM?1.3 How to do 在这里聚焦基于Verilog的三段式状态机编程; 1 FSM 1.1 Intro 状态机是一种代码实现功能的范式;一切皆可状态机; 状态机编程四要素:– 1.状态State&#…

接口自动化测试工程化——了解接口测试

什么是接口测试 接口测试也是一种功能测试 我理解的接口测试,其实也是一种功能测试,只是平时大家说的功能测试更多代指 UI 层面的功能测试,而接口测试更偏向于服务端层面的功能测试。 接口测试的目的 测试左移,尽早介入测试&a…