合批简介
什么是合批
合批(Batching)是计算机图形学中的一种优化技术,主要用于减少渲染过程中需要处理的绘制调用(Draw Calls)数量。
在游戏开发中,特别是在使用 Unity 这样的引擎时,合批可以显著提高性能,尤其是在场景中有大量相似对象时。
绘制调用(Draw Calls)
每次渲染引擎向 GPU 发送绘制指令都称为一个绘制调用。每个绘制调用都会消耗 CPU 和 GPU 的资源,过多的绘制调用会导致性能下降。
合批的目的就是通过将多个对象的渲染合并为一个绘制调用,减少绘制调用的数量,从而提高渲染效率。
合批的类型
合批分为以下几种类型,在后面会分别详细解释。
静态合批(Static Batching)
动态合批(Dynamic Batching)
GPU 合批(GPU Batching)
分析性能
Stats
Unity运行游戏,点击Game窗口的Stats选项,弹出下面的窗口:

分析合批可以从已下信息入手:
Batches(批次):显示当前场景中进行的绘制调用的数量。较高的批次数量可能表示合批效率低下。
Saved by batching(通过合批节省的数量):显示通过合批技术节省的绘制调用数量。这个值越高,说明合批效果越好。
SetPass calls(设置材质调用次数):较高的 SetPass 调用次数可能表示材质使用不当,影响合批效率。
Verts(顶点数量):动态合批对顶点数量有限制,监控顶点数量有助于判断合批是否有效。
Profiler
此外,我们还可以使用Unity Profiler来分析合批。在 Unity 编辑器中,选择菜单栏的 Window > Analysis > Profiler。

运行游戏,这个界面会实时监测游戏的性能情况。暂停检测,可以拖动上面的时间轴来查看每一帧的性能情况。点击Rendering,可以查看渲染情况,如图所示。
除了我们在Stats查看的一些数据之外,这里还详细列出了Dynamic Batching 和Static Batching 的一些情况。有助于我们进行合批的分析。
Frame Debugger
在菜单中选择 Window > Analysis > Frame Debugger,启用它并逐帧查看绘制调用。这可以帮助你识别哪些对象没有被合批。

上面是一个实例的Frame Debugger 界面。用于分析每一帧的渲染过程,帮助开发者了解渲染调用的细节和性能瓶颈。每一项后面的数字是调用次数。
Draw Calls 通常在 "Drawing" 部分下的具体绘制事件中会有所体现,比如 Event #13: Draw Mesh 可能与具体的绘制调用相关联。要查看具体的 Draw Calls 数量,通常需要关注整个绘制过程中的相关事件。
静态合批
什么是静态合批
静态合批是 Unity 中的一种优化技术,用于将多个静态对象合并成一个单一的网格,以减少绘制调用(Draw Calls)。当多个对象共享相同的材质并且在场景中位置固定时,静态合批可以显著提高渲染性能。通过合并这些对象,Unity 可以一次性绘制它们,而不是逐个绘制,从而减少 CPU 和 GPU 的负担。
静态合批的条件
使用静态合批的条件包括:
对象静态性:对象必须是静态的,意味着它们在场景中不会移动、旋转或缩放。
共享材质:对象必须使用相同的材质,以便可以合并。
适当的网格:合批的对象网格必须是合适的,不能过于复杂。
场景设置:需要在场景设置中启用静态合批。
设置静态合批
要设置静态合批,需遵循以下步骤:
标记对象为静态:
选中需要合批的对象,在 Inspector 面板中勾选 "Static" 选项。这会将对象标记为静态,并允许 Unity 在渲染时进行合批。

合批的限制:
物体数量限制:虽然静态合批可以合并多个对象,但合并的对象数量过多可能会导致性能下降。
顶点数限制:合并后的网格顶点数也有上限,通常为 65,536 个顶点。
纹理限制:合并的对象必须使用相同的材质和纹理。
例如我在场景中放置多个胶囊体,静态合批前的Stats如下:

将所有的胶囊体勾选Static选项后,Stats变为下面:

发现Batchs数减少了。表明合批有效。
不妨自己打开Fream Debugger看看发生了什么变化。
动态合批
什么是动态合批
动态合批是 Unity 中的另一种优化技术,主要用于在运行时将多个动态对象合并为一个单一的绘制调用。与静态合批不同,动态合批允许对象在场景中移动、旋转或缩放。它通过在 GPU 端进行合并,减少了绘制调用的数量,从而提升了渲染性能。动态合批适用于需要频繁更新的对象,如角色、移动的物体等。
使用动态合批的条件
使用动态合批的条件包括:
材质一致性:所有参与合批的对象必须使用相同的材质。
顶点数限制:单个对象的顶点数不能超过 900 个。超过这个限制的对象将不会参与动态合批。
变换一致性:对象的变换(位置、旋转、缩放)必须在同一帧内保持一致,以便能够进行合批。
动态对象:对象必须是动态的,可以在场景中移动或变换。
设置动态合批
动态合批在 Unity 中通常是默认启用的,但可以在项目设置中确认。前往 Edit > Project Settings > Player,在 Other Settings 中查看 Dynamic Batching 选项。

图集(Texture Atlas)实现合批
图集(Texture Atlas)是一种将多个小纹理合并成一个大纹理的技术,在渲染过程中,切换材质会导致 GPU 重新加载纹理,增加绘制调用(Draw Calls)的数量。通过使用图集,多个对象可以共享同一个大纹理,从而避免频繁的材质切换,降低绘制调用的数量。
使用方法
使用Unity 的 Sprite Atlas可以创建图集以供使用。在 Project 窗口中,右键点击你想要创建 Sprite Atlas 的文件夹。选择 Create > 2D > Sprite Atlas。
选择Sprite Atlas,你可以在Inspector窗口中进行设置。
Packing Tag:为图集设置一个 Packing Tag,这样可以在使用时轻松识别。
Max Texture Size:设置图集的最大纹理大小(例如 2048、4096 等)。
Compression:选择纹理压缩选项,以优化性能和内存使用。
Enable Alpha Is Transparency:如果你的 Sprite 有透明部分,可以勾选这个选项。
评论区