合批Batching

发布于:2025-03-21 ⋅ 阅读:(20) ⋅ 点赞:(0)

一、stats面板

FPS:帧率

表示一秒可以渲染的帧数,FPS 数值越高,游戏场景的动画显示会更加平滑和流畅

一般来说,超过 30 FPS的画面人眼不会感觉卡,因此游戏画面每秒帧数至少保证在30以上

其中 1s=1000ms ,当 1s 可以渲染30帧时,那么 1ms 可以渲染 1000/30 帧

CPU:当前占用CPU进行计算的时间绝对值

  • 获取当前占用CPU进行计算的时间绝对值,或时间点,如果Unity 主进程处于挂断或休眠,CPU time 保持不变

Render Thread:GPU 渲染所花费的时间

  • GPU 渲染进程处理图像所花费的时间,具体数值有GPU性能决定

Batches:批处理(合批)

DrawCall : CPU每次调用图形API命令GPU进行渲染的操作

批处理指的是将多个DrawCall合并为一个DrawCall,可以让CPU将满足条件的多个对象的渲染组合到一个内存块中以便减少由于资源切换而导致的 CPU 开销

其中一个批次(Batch)指的是CPU把数据加载到显存,然后设置渲染状态及数据,之后CPU调用DrawCall命令的这一整个过程就是一个Batch

SetPass Call:Shader中的Pass被切换的次数


二、如何降低批次

1.动态合批

网格的动态批处理旨在优化旧低端设备的性能。在现代消费类硬件上,动态批处理在 CPU 上所做的工作可能大于绘制调用的开销。这会对性能产生负面影响。

动态合批就是将材质相同的动态对象合并到一个批次中渲染,但是其中每个对象的顶点数都不能超过300,其所有的顶点属性不得超过900

动态合批由于是运行时合并网格,因此不仅会增大内存,还会占用CPU时间。动态合批一般应用在一些小物体的合并上,比如小的道具或者特效等

2.静态合批

静态合批是将勾选了静态的对象(相同材质为前提)合并成一个大往往以减少绘制调用。它将组合的网格转换为世界空间,并为它们构建一个共享顶点和索引缓冲区。然后,对于可见网格,Unity 会执行一系列简单的绘制调用,每个调用之间几乎没有状态变化。
静态批处理不会减少绘制调用的数量(DrawCall),而是减少它们之间的渲染状态更改的数量

静态合批实际上是引擎在打包或者烘焙时候,将同材质的物体合并成一个更大的物体,这样相同材质的物体只需要一次渲染状态设置和一次DrawCall调用,也就一个批次。由于合并生成大的模型后,会占用额外的内存空间,比如三个同材质的立方体的网格就是一个简单的立方体,合并后的网格占用是三个世界空间立方体的组合,因此有时候需要考虑静态合批带来的内存增长

3.GPU实例化

实例化的网格模型必须相同,材质相同,但材质属性可以不同