Uninomicon

Documenting the dark corners of the Unity Engine.

User Tools

Site Tools


static_batching

This is an old revision of the document!


Renderer Batching

There are a few different ways that Unity can combine meshes together, for optimization:

  • “Static Batching” - The checkbox in the Unity Player Settings. Can be done on build or at runtime 1).
  • “Dynamic Batching” - A now-outdated mode of runtime batching. Not recommended. 2)
  • “SRP Batching” - A new runtime batcher for the SRP.

Note that none of these options actually combine meshes together. They will all result in the same number of graphics API drawcalls. Instead, the purpose of batching is to optimize the order of drawcalls to avoid changing state between calls.

Static Batching

Static Batching in Unity creates a Read-Only mesh named “Combined Mesh (root: <root-game-object>)”, with a Submesh for each batched renderer. Unity invokes a separate draw call for each range of indices within the combined mesh buffer.

Note that this means Unity does not actually render the entire batch in a single draw call. As they mention, truly merging all meshes would make culling vastly less effective.

Instead, the performance comes from issuing fewer material / mesh change state operations (in OpenGL at least). In a lot of ways, this ends up being more similar to SRP Dynamic Batching.

Mobile developers should be aware that static batching can unexpectedly increase your build size, some batching appears to be done at build time, which can result in significantly more mesh data if you had lots of scenes with heavily-instanced geometry.

Lightmap UV Coordinates

The lightmap coordinates from Lighting Data Asset are baked into the Combined Mesh UV coordinates when the scene loads3). Afterwards, querying meshRenderer.lightmapScaleOffset will return the old scale and transform, even though it has been baked into the mesh. Technically, in the render pipeline, all of these meshes have a lightmapST (scale/transform) of '(1,1,0,0)'. 4)

1)
See StaticBatchingUtility.Combine to batch meshes at runtime.
2)
I can no longer find a player settings checkbox to even enable this feature
3)
I think this also happens during standalone build, not at runtime, but I'm not sure
4)
It shows the scale and transform it loaded from the LightingDataAsset file for that renderer.
static_batching.1619972451.txt.gz · Last modified: 2021/05/02 16:20 by 167.114.64.97