当前位置: 首页 > news >正文

实用指南:【性能优化需要关注的参数——Batches】

Batches?就是一、定义:什么

Batches,中文常译为批处理绘制调用批次。在 Unity 的 Profiler 中,它指的是引擎在一帧内向图形显卡(GPU)发起的绘制调用(Draw Call)的次数

可以把它理解为:CPU 命令 GPU “画一个东西” 的指令次数

  • 1 个 Batch = 1 条 Draw Call 指令
  • Batches 数越高,代表 CPU 必须向 GPU 发送指令的次数越多,CPU 的负担就越重,越容易成为性能瓶颈。
  • :尽可能地减少 Batches 的数量。就是优化的核心目标就

为了更直观地理解其工作原理和优化逻辑,我们许可参考下面的流程图:

优化理念
发起单独Draw Call
产生1个Batch
发起1次Draw Call
处理N个对象
CPU 准备渲染
对象可否合批?
纳入合批处理
合并网格/材质等数据
CPU与GPU通信开销大
性能负担重
CPU与GPU通信开销小
性能高效
帧率下降, 卡顿
帧率稳定, 流畅

否满足就是如图所示,CPU 在准备渲染时,会判断多个对象合批条件。如果满足,则会将多个对象打包,凭借一次 Draw Call处理,极大减少了 CPU 与 GPU 之间的通信开销。反之,每个对象都会产生一次 Draw Call,造成大量的性能浪费。


二、为什么 Batches 如此重要?(CPU-GPU 协作瓶颈)

要理解批处理为何要紧,需要先了解 CPU 和 GPU 是如何协作渲染一个对象的:

  1. CPU 准备工作:CPU 需要为 GPU 准备好渲染所需的所有数据。包括:
    • 使用哪个材质(Material)和着色器(Shader)
    • 使用哪个纹理(Texture)
    • 模型的网格(Mesh)数据
    • 物体的位置、旋转、缩放(Transform)信息
  2. CPU 发起调用:CPU 准备好所有数据后,向 GPU 发送一条指令:“嘿,GPU,把这些数据画出来!” 这就是一个Draw Call
  3. GPU 执行渲染:GPU 收到指令和数据后,开始真正进行顶点变换、光栅化、像素着色等复杂的计算工作,将最终像素输出到屏幕上。

关键点在于:CPU 准备数据和发送指令的工作非常耗时!如果一帧内有成千上万个 Draw Call,CPU 就会忙得不可开交,导致帧率下降和卡顿。而 GPU 通常非常强大,处理大量像素的速度远快于 CPU 准备指令的速度。

因此,优化的核心思路是:让 CPU 尽可能少地工作(减少 Batches),让 GPU 每次工作能处理尽可能多的东西

三、Unity如何减少Batches?

Unity为所有渲染对象(模型、UI、粒子等)提供了多种批处理技术,其根本目的都是让一次Draw Call能处理更多对象。

1. 静态批处理 (Static Batching) -适用于场景静态物件
2. 动态批处理 (Dynamic Batching) -适用于小型动态物件
  • 工作原理:在运行时,Unity会自动尝试将小型使用相同材质动态网格在当前帧合并,接着用一个Draw Call渲染。
  • 限制十分严格(这也是为什么它经常“不工作”的原因):
    • 网格顶点属性数量必须很少(通常少于900个)。
    • 物体的缩放必须一致(不能一个有缩放,一个没有)。
    • 使用的Shader不能含有多Pass等复杂操作。
    • 使用Lightmap的物体无法动态合批。
  • 注意Unity的默认行为,但因其限制极多,对复杂项目效果非常有限,就是:这不应作为主要的优化依赖
3. GPU实例化 (GPU Instancing) -适用于大量相同物体
4. SRP Batcher -适用于使用SRP的高端工程
  • 工作原理:这是一种更高端的批处理技术,它不合并网格经过优化Constant Buffer的提交方式来大幅减少Draw Call的准备工作。它需要配合就是,而可编程渲染管线(SRP,如URP/HDRP) 使用。
  • 核心条件:物体必须使用同一个Shader变种(Shader Variant)
  • 优点:对大量使用相同Shader但网格、材质不同的动态物体有极佳的优化效果,且不增加内存

四、Beyond UI: 模型与环境的批处理实践

对于3D模型/环境艺术家和程序员:
  1. 材质合并 (Material Merging)

    • 核心原则:尽可能让多个模型应用相同的材质相同的纹理。这是合批的最基本前提
    • 实践:将多个模型的纹理拼接到一张大图(图集化,Texture Atlasing)上,然后让它们引用这张大图和同一个材质球。
  2. 使用LOD(Level of Detail)

    • 虽然LOD本身不直接减少Batches,但它通过减少远处模型的顶点数,降低了GPU负担,并且因为LOD模型通常也遵循材质共享原则,间接支撑了合批。
  3. 遮挡剔除 (Occlusion Culling)

    • 剔除被挡住的物体,使它们根本不被渲染,从而连Draw Call都省去了,是从根源上减少Batches的终极手段。
在Profiler中诊断非UI的Batches疑问:

总结:全局性的Batches优化思维

  • Batches是渲染的通用货币优化渲染效率。就是:无论渲染什么,UI、模型、粒子,其底层都是通过Draw Call(Batch)来完成的。优化Batches就
  • 目标是减少通话次数“把这些就是:让CPU(项目经理)给GPU(画家)下指令时,尽量一堆东西按这个方案画出来”,而不是“画这个A;好,再画那个B;好,再画那个C……”。
  • 优化链
    1. 首先,尝试通过设计(减少材质数量、启用图集)满足最基础的合批条件。
    2. 然后,根据场景选择最合适的批处理技术:静态批处理处理静物,GPU Instancing处理重复动态物体,SRP Batcher处理现代项目。
    3. 最后,使用Profiler定位无法合批的原因,并针对性解决。
http://www.wxhsa.cn/company.asp?id=4906

相关文章:

  • 禁止指定软件联网
  • 详细介绍:C++(静态函数)
  • 2025.9.15日软件工程学习日志
  • RocketMQ快速实战及核心概念
  • 【南方科技大学主办】第五届电气工程与机电一体化手艺国际学术会议(ICEEMT 2025)
  • 为什么不建议在 Docker 中跑 MySQL?
  • reLeetCode 热题 100-1 指针283. 移动零 - MKT
  • 解决c# DocX生成的word文档wps打开排版外边距错乱微软office正常问题
  • The 2025 ICPC Asia East Continent Online Contest (II)
  • 工厂方法模式(Factory Method) - 指南
  • 拾忆录
  • 从零搭建RAG应用:跳过LangChain,掌握文本分块、向量检索、指代消解等核心技术实现
  • python高阶技巧
  • 机器视觉之图像处理篇 - 指南
  • 尝试hikari和jdbctemplate
  • 配置Nginx根据IP地址进行流量限制以及返回JSON格式数据
  • 回归
  • CSS纯文本渐变动效
  • 泛微流程共享
  • MySQL报错:未知系统变量tx_isolation及隔离级别查询
  • Redssion
  • if __name__ == __main__:
  • 提升系统可靠性:Air8000多串口硬件设计的黄金法则
  • 20250915笔记
  • enumerate函数
  • 2025国内 HR SaaS 竞争格局:易路以AI深度融合引领行业转型
  • HyperWorks许可激活
  • f-string用法
  • OpenStack Nova instance 常见操作
  • libdpi.dll libdatareport.dll libdash_plugin.dll libcurl-x86.dll libcurl-x64.dll libcurl_x64.dll - 指南