Qué es una draw call#
Una draw call es una orden de la CPU a la GPU: "dibuja esta malla con este material". Cada objeto visible suele generar al menos una. El problema no es dibujar los triángulos (eso lo hace la GPU rápido), sino la preparación de cada orden en la CPU: cambiar de material, de textura, de shader. A eso se le llama SetPass call, y es lo caro.
Mucha gente cree que "menos triángulos = más FPS". A menudo el problema real es demasiadas draw calls / SetPass calls: la CPU se ahoga preparando miles de órdenes. Por eso 1.000 objetos con materiales distintos van peor que 1.000 con el mismo material, aunque tengan los mismos polígonos.
Batching: agrupar para mandar menos órdenes#
Batching = combinar varios objetos en una sola draw call. Unity ofrece varios mecanismos:
| Mecanismo | Cómo | Requisito clave |
|---|---|---|
| SRP Batcher | Agrupa por shader compatible | URP/HDRP; shaders compatibles |
| Static batching | Combina objetos que no se mueven | Marcar objetos como Static |
| GPU instancing | Dibuja muchas copias del mismo mesh de una vez | Mismo mesh + material con instancing |
| Dynamic batching | Combina mallas pequeñas en movimiento | Mallas muy pequeñas (limitado) |
SRP Batcher (lo primero en URP)#
Si usas URP, el SRP Batcher está activo por defecto y reduce mucho el coste agrupando objetos que comparten el mismo shader (aunque tengan distintos valores). Clave: usa shaders compatibles (los de URP lo son) y no rompas la compatibilidad con materiales raros.
Static batching#
Para lo que nunca se mueve (escenario, decorados), marca los objetos como Static (casilla arriba a la derecha del Inspector). Unity los combina en menos draw calls a cambio de algo más de memoria.
GPU instancing#
Para muchas copias del mismo objeto (100 árboles, 500 rocas iguales), activa Enable GPU Instancing en su material. La GPU las dibuja todas de una sola orden.
Compartir materiales y atlas de texturas#
La regla de oro para el batching: cuantos menos materiales y texturas distintas, mejor.
- Comparte materiales: 50 objetos con el mismo material agrupan; con 50 materiales distintos, no.
- Atlas de texturas: mete muchas texturas pequeñas en una sola imagen grande (en 2D, un Sprite Atlas). Así los objetos comparten textura y se agrupan.
Cada vez que haces renderer.material en código, Unity clona el material para ese objeto, creando uno nuevo que ya no comparte con los demás y rompe el batching. Si necesitas variar algo por objeto sin romper el agrupamiento, usa un MaterialPropertyBlock.
Mídelo con el Frame Debugger#
Window → Analysis → Frame Debugger reproduce el renderizado paso a paso: ves cada draw call, qué la causó y por qué no se agrupó con la anterior ("different material", "different shader keywords"...). Es la herramienta para entender por qué tienes tantas y atacarlas. Combínalo con el Profiler, que muestra el número total de SetPass calls y Batches.
Un método práctico#
- 1. Mide: mira SetPass calls y Batches en el Profiler
- 2. ¿Muchas? Abre el Frame Debugger y busca por qué no se agrupan
- 3. Comparte materiales, usa atlas, marca lo estático como Static
- 4. Para copias iguales, activa GPU instancing
- 5. No rompas el batching con
.material(usa MaterialPropertyBlock) - 6. Vuelve a medir
Errores frecuentes#
- Optimizar polígonos cuando el problema son las draw calls (mide antes).
- Materiales únicos por objeto sin necesidad (rompe todo el batching).
- Usar
renderer.materialen bucle y clonar cientos de materiales. - No marcar el escenario como Static.
- Muchas texturas sueltas en 2D en vez de un Sprite Atlas.
Ponte a prueba#
Resumen#
Demasiadas draw calls (y sus SetPass calls) ahogan la CPU. Redúcelas: aprovecha el SRP Batcher (URP), marca lo estático como Static, usa GPU instancing para copias iguales, y comparte materiales/texturas (atlas). No rompas el batching con .material (usa MaterialPropertyBlock). Diagnostícalo con el Frame Debugger y el Profiler, y mide antes y después.