news 2026/6/10 16:56:12

3.7 SRP Batcher

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
3.7 SRP Batcher

1.传统渲染模式(非 SRP Batcher)的处理方式

2.SRP Batcher 的处理方式

3.如何开启SRP Batcher

4.SRP Batcher的使用限制


1.传统渲染模式(非 SRP Batcher)的处理方式

在传统模式下,"材质参数是否不同"是判断"是否需要切换渲染状态"的核心依据,哪怕只是同一个Shader的不同材质实例(参数不同),CPU都会做大量重复的状态切换工作:核心逻辑 a.渲染状态的判定标准:传统模式中,"材质实例"是渲染状态的核心标识 —— 每个不同的材质实例(哪怕仅参数不同),都会被 视为"不同的渲染状态"b.具体处理流程(3个物体为例:Shader相同,材质A/材质B/材质C,参数分别为颜色红/绿/)-CPU处理物体1:设置材质A的所有参数(纹理、颜色红、Shader 变体等)→ 提交Draw Call → 绘制物体1-CPU处理物体2:先清空/切换材质A的状态 → 设置材质B的所有参数(纹理、颜色绿、Shader 变体等)→ 提交Draw Call → 绘制物体2-CPU处理物体3:再清空/切换材质B的状态 → 设置材质C的所有参数(纹理、颜色蓝、Shader变体等)→ 提交Draw Call → 绘制物体3c.最终结果 产生3DrawCall(物体数=Draw Call 数)核心开销:CPU反复切换材质状态(每次切换都要向GPU重新传递所有材质参数),这是最大的性能损耗点 补充:传统动态批处理的例外 只有当物体满足"顶点数 < 900 + 使用完全相同的材质实例(参数无差异)",传统动态批处理才会合并DrawCall;但只要 材质参数不同,哪怕Shader一样,动态批处理也失效,仍会逐个提交Draw Call

2.SRP Batcher 的处理方式

SRP Batcher的核心优势就体现在"区分参数类型"—— 哪怕材质参数不同,只要这些差异属于"Per-Object(每个物体)数据",就能大幅减少状态切换 第一步:先判断"参数差异的类型"SRP Batcher会把材质参数分为两类,这是处理的关键

第二步:具体处理流程(同上面3个物体的例子:Shader相同,仅颜色参数不同)a.预处理阶段 CPU提前将该Shader对应的Per-Material公共数据(比如纹理、高光强度)打包,一次性上传到GPU的常量缓冲区并缓存 —— 这 一步只做1次 b.绘制阶段-CPU为这3个物体仅设置1次Shader/Per-Material 公共状态(无需反复切换)-仅为每个物体更新Per-Object数据(颜色红/绿/蓝、各自的世界矩阵),这些数据会被批量组织成连续内存块上传-最终批量提交这3个物体的绘制指令(1次核心的状态设置,后续仅更新可变参数)c.最终结果 产生1"有效状态切换"+3次轻量级的DrawCall(仅更新 Per-Object 数据)核心开销:几乎消除了"Shader / 材质公共状态"的切换成本,仅保留少量Per-Object 数据的更新开销(远低于传统模式)
例外情况:若参数差异是Per-Material类型 如果材质参数的差异是"Per-Material级"(比如一个用纹理A,一个用纹理B),那么SRP Batcher会将它们分为不同的组-用纹理A的物体归为组1,用纹理B的归为组2-1:1次状态设置+组内物体批量绘制-2:1次状态设置+组内物体批量绘制-相比传统模式,仍能减少组内的状态切换开销(比如组110个物体,传统模式10次切换,SRP Batcher仅1)
直观例子对比 假设场景中有100个立方体,用同一个Shader,仅每个立方体的自发光颜色不同 a.传统模式:100DrawCall,100次材质状态切换,CPU开销大b.SRPBatcher:1次核心状态设置+100次轻量级Per-Object数据更新,CPU开销仅为传统模式的1/10甚至更低

3.如何开启SRP Batcher

在Unity2021后,在SRP管线(URP、HDRP)中该功能默认开启,不允许关闭了;之前的版本中可以在URP Asset中的Inspector窗 口勾选开启,观察SRP Batcher是否工作,只需要用Frame Debugger查看渲染事件是否为SRP Batch即可

4.SRP Batcher的使用限制

1).对象使用的Shader必须与SRP Batcher兼容 在HDRP和URP中,所有Lit Shader和Unlit Shader都符合这一要求(除了它们的粒子版本);若要让一个自定义Shader与SRP Batcher兼容,它必须满足以下要求 a.Shader必须将所有引擎内置属性声明在一个名为UnityPerDraw的常量缓冲区里 b.Shader必须将所有材质属性声明在一个名为UnityPerMaterial的常量缓冲区里
-引擎内置属性是Unity引擎自动为每个渲染物体生成、管理的属性,不是你在Shader里自定义的,也没法在材质面板手动调 整,这些属性的核心特点是:每个物体独有、随物体变化(比如物体的位置/旋转/缩放对应的矩阵)-材质属性是你在Shader里自定义的、可以在材质面板手动调整的属性,核心特点是:同一材质的所有物体共用、不随物体变 化(比如一个红色材质,所有用它的物体都是红色)

2).对象不能使用 MaterialPropertyBlocks,MaterialPropertyBlock 是一个特殊的容器,用来在不复制材质的情况下,给 某个物体单独设置材质参数3).对象不能是粒子 对象需要是MeshRenderer或SkinnedMeshRenderer(注意:蒙皮网格渲染器在新版本支持,2019之前不支持)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 15:06:30

GEO赛道榜单:AI营销获客难?看原圈科技如何领跑2026

原圈科技在GEO&#xff08;生成式引擎优化&#xff09;领域表现突出&#xff0c;被普遍视为2026年度领跑者。其核心优势在于&#xff0c;拥有能够兼容国内外主流大模型的自主技术底座&#xff0c;并打造了从洞察、内容到转化的"AI营销员工"产品矩阵。通过在金融、汽车…

作者头像 李华
网站建设 2026/6/10 15:03:59

人类自然语言与大模型的桥梁——Embedding嵌入模型

“ Embedding模型是自然语言和模型的桥梁。” 了解过RAG技术的人应该都知道Embedding嵌入模型&#xff0c;但很多人可能并没有认真了解过这个核心组件&#xff1b;在大部分人眼中&#xff0c;Embedding模型是一个“不重要”的组件&#xff0c;只需要把文档切分之后&#xff0c;…

作者头像 李华
网站建设 2026/6/10 15:08:13

网络安全学习路线图:从零基础到全栈工程师

网络安全学习路线图&#xff1a;从零基础到全栈工程师 “看了 3 个月网络安全教程&#xff0c;学了 TCP/IP、防火墙原理&#xff0c;却连‘怎么用 Nmap 扫一个端口’都不会&#xff1b;跟着视频做了 DVWA 漏洞复现&#xff0c;换个靶场就一脸懵&#xff1b;不知道该先学 Web 渗…

作者头像 李华
网站建设 2026/6/10 13:43:51

如何避免职业倦怠:软件测试工程师的终极自救手册

倦怠危机的行业特殊性 在敏捷开发与持续交付的行业背景下&#xff0c;软件测试工程师面临版本迭代加速、需求变更频繁、质量责任高压三重挑战。2025年行业调研显示&#xff0c;78%的测试从业者存在中度以上倦怠感&#xff0c;其中自动化脚本维护、跨部门协作摩擦、技术迭代焦虑…

作者头像 李华
网站建设 2026/6/9 17:27:52

亲测好用!专科生毕业论文TOP10 AI论文平台测评

亲测好用&#xff01;专科生毕业论文TOP10 AI论文平台测评 2026年专科生毕业论文AI平台测评&#xff1a;选对工具事半功倍 随着人工智能技术的不断进步&#xff0c;越来越多的专科生开始借助AI写作工具来提升毕业论文的撰写效率与质量。然而&#xff0c;面对市场上五花八门的平…

作者头像 李华
网站建设 2026/6/8 19:41:04

Apache HTTP Server 高危漏洞:mod_proxy编码问题导致认证绕过

Apache HTTP Server — ACL 绕过 CVE-2024–38473 概述&#xff1a; 描述&#xff1a; 此漏洞源于 mod_proxy 模块中的一个编码问题&#xff0c;它允许将编码不正确的请求 URL 发送到后端服务。这有可能通过精心构造的请求绕过认证。 该漏洞可能允许攻击者绕过认证机制&#xf…

作者头像 李华