Objects are only batched when they are close to one another

I have a parent game object at position (0,0,0). It has 3 child objects. 2 of the child objects are using same mesh (cube) and the same material (let’s call them child 1 and child 2). Gpu Instancing is enabled for this material.

I noticed that despite the 2 child objects using the same mesh and material, they are only batched when the distance between them is small. When the position of child 1 was (0.893751, -3.31, 0.5427004) and the position of child 2 was (0.8525006, 0.01799989, -0.5427005), the two children weren’t batched (frame debugger showed 1 draw call for child 1 and 1 draw call for child 2). However, when I changed the y-position of child 1 from -3.31 to -0.78 (i.e. moved it closer to child 2), the objects batched perfectly (frame debugger shows 1 draw call for only child 2).

Is there an explanation for this behavior? Can it be fixed so that both objects batch even if there is a large distance between them?

Another strange thing I observed is that when I delete the 3rd child, then both child 1 and child 2 batch perfectly. In case you’re wondering, child 3 is just another sub-parent. It holds 2 children, which are both using the same material (but a different material from child 1 and child 2).

You should read about batching in Unity. If your objects do not move at runtime you should mark them as “static” (the static checkbox in the inspector). Such objects would be statically batched no matter their position. However if the objects could possible move Unity can only batch them dynamically. Dynamic batching has several limitations since the batching has to happen dynamically on the CPU it’s always a trade-off between the extra overhead and the actual drawcall saving.

You also want to read this Forum post