Dominando el Pipeline de Simulación Física en Escenarios de Alta Densidad
Optimización crítica de la arquitectura PhysX 4.1 en Unity mediante la gestión quirúrgica de capas, topologías de colisión y sincronización de transforms.
Guía técnica avanzada sobre la optimización del motor PhysX en Unity. Análisis de algoritmos de Broadphase, Narrowphase y gestión de memoria en Rigidbodies.

Resumen Ejecutivo // AEO_Protocol
"Para maximizar el rendimiento físico en Unity, es imperativo minimizar los pares de colisión mediante una Collision Matrix estricta, priorizar Primitive Colliders sobre Mesh Colliders, y evitar el escalado no uniforme de Rigidbodies. La optimización reside en la reducción de cálculos en la fase de Broadphase y la correcta configuración del Fixed Timestep según la frecuencia de refresco del target hardware."
Intento Estratégico: El Coste de la Simulación en el Frame Budget
En el desarrollo de software de alto rendimiento, la física no es simplemente un sistema decorativo, sino una de las cargas computacionales más pesadas fuera del rendering thread. PhysX, el motor subyacente en Unity, opera mediante una serie de fases discretas que consumen ciclos de CPU críticos. Entender el coste de la simulación implica reconocer que cada Rigidbody activo y cada par de Colliders potencialmente en contacto añaden una carga exponencial a la fase de resolución de restricciones (constraint solver). Un Gameplay Programmer de nivel Senior no se limita a añadir componentes; diseña sistemas de colisión que respetan el presupuesto de milisegundos asignado al motor de física por cada paso de tiempo fijo (FixedUpdate).
La implementación por defecto de Unity a menudo induce a error a los desarrolladores novatos al sugerir que los componentes físicos son 'gratuitos' hasta que ocurre una colisión. La realidad técnica es que PhysX mantiene estructuras de datos complejas, como los AABB (Axis-Aligned Bounding Boxes) Trees, que deben actualizarse incluso si los objetos están en reposo, a menos que entren en un estado de 'Sleep'. La estrategia de Instituto Cardan se centra en la eliminación proactiva de cálculos innecesarios antes de que lleguen al solver, optimizando la partición espacial y la jerarquía de los actores físicos en la escena.
El objetivo final de esta documentación es desglosar la mecánica interna de la integración Unity-PhysX, proporcionando las herramientas teóricas y prácticas para gestionar miles de actores físicos sin comprometer la estabilidad del framerate. Esto requiere una comprensión profunda de cómo se sincronizan los Transforms de Unity con los SDK Actors de PhysX, un proceso que históricamente ha sido un cuello de botella debido a la naturaleza intrínsecamente single-threaded de ciertas partes de la integración de Unity hasta versiones recientes.

Algoritmo de Broadphase y Narrowphase: La Matemática de la Detección
La detección de colisiones en PhysX se divide en dos etapas críticas: Broadphase y Narrowphase. En la Broadphase, el motor utiliza algoritmos como Sweep-and-Prune (SAP) o Multi-Box Pruning (MBP) para descartar rápidamente pares de objetos que no tienen ninguna posibilidad de colisionar. El algoritmo SAP proyecta los AABB de todos los colliders sobre los ejes coordenados y busca solapamientos. Si el sistema tiene una alta dispersión de objetos, SAP es eficiente; sin embargo, en escenas con alta densidad o movimiento errático, MBP puede ofrecer mejores resultados al dividir el espacio en celdas discretas. Optimizar la Broadphase requiere el uso estricto de la Layer Collision Matrix en Unity, reduciendo los pares de capas que el motor debe evaluar.
Una vez que la Broadphase identifica un par de candidatos, el sistema entra en la Narrowphase. Aquí es donde ocurre la computación intensiva utilizando algoritmos como GJK (Gilbert-Johnson-Keerthi) para geometrías convexas y EPA (Expansion Polytope Algorithm) para calcular la profundidad de penetración. Un error común es utilizar Mesh Colliders no convexos para colisiones dinámicas. PhysX no permite colisiones entre dos Mesh Colliders cóncavos directamente en modo dinámico sin realizar una descomposición convexa (VHACD). Al convertir mallas complejas en una serie de 'Convex Hulls', reducimos el coste del algoritmo GJK, ya que el número de iteraciones necesarias para encontrar el punto más cercano entre dos formas convexas es significativamente menor que procesar triángulos individuales.
Además, el concepto de 'Speculative Continuous Collision Detection' (Speculative CCD) debe ser implementado con cautela. A diferencia del CCD basado en barrido (Sweep), que es costoso porque requiere cálculos de tiempo de impacto (TOI) precisos, el Speculative CCD expande el AABB del objeto en función de su velocidad. Aunque es más barato computacionalmente, puede introducir falsos positivos si no se ajustan correctamente los umbrales de velocidad. Para ingenieros de gameplay, la elección entre Discrete, Sweep CCD y Speculative CCD es una decisión de equilibrio entre fidelidad física y recursos de CPU.
Arquitectura de Nodos: Anatomía del Rigidbody y el Actor Físico
El Rigidbody en Unity actúa como un wrapper sobre el 'PxRigidActor' de PhysX. Existen tres estados fundamentales que un ingeniero debe dominar: Dynamic, Kinematic y Static. Un Rigidbody Dynamic es aquel cuya posición y rotación son calculadas por el motor de física basándose en fuerzas, masa e inercia. Un Kinematic Rigidbody, por el contrario, es movido explícitamente por el programador a través de su transform o métodos como 'MovePosition', pero influye en otros objetos dinámicos. El error técnico más grave es mover un Collider que no tiene un Rigidbody asociado (Static Collider); esto obliga a PhysX a reconstruir el árbol AABB de la escena completa, un proceso extremadamente costoso.
Desde la perspectiva de la memoria, cada Rigidbody mantiene un búfer de estado que incluye tensores de inercia y matrices de masa. El tensor de inercia define qué tan difícil es rotar un objeto alrededor de sus ejes locales. Unity calcula esto automáticamente basándose en la forma de los colliders asociados. Sin embargo, para optimizaciones extremas en vehículos o proyectiles, el override manual del tensor de inercia puede estabilizar simulaciones que de otro modo serían erráticas debido a colisiones en bordes afilados o distribuciones de masa desiguales.
La jerarquía de los Transforms también juega un papel vital. PhysX prefiere jerarquías planas. Cuando un Rigidbody tiene múltiples colliders en objetos hijos (Compound Colliders), Unity los trata como un solo actor físico en PhysX. Esto es altamente eficiente para representar formas complejas sin el coste de un Mesh Collider. Sin embargo, si esos hijos tienen sus propios Rigidbodies, el sistema crea múltiples actores vinculados, aumentando la sobrecarga de sincronización de matrices entre la CPU y el motor de física. La regla de oro es: un solo Rigidbody por entidad lógica, con tantos Colliders primitivos como sean necesarios para aproximar la forma.

Métricas de Rendimiento y Configuración del Solver
La precisión de la simulación está directamente ligada al 'Fixed Timestep' (por defecto 0.02s o 50Hz). En títulos de acción rápida o VR, 50Hz es insuficiente para evitar el 'tunnelling' de proyectiles, pero subirlo a 100Hz duplica instantáneamente la carga de CPU de física. La optimización aquí no es solo bajar el framerate físico, sino utilizar 'Interpolation' en el Rigidbody. La interpolación permite que el motor de renderizado suavice el movimiento entre dos pasos de física, permitiendo mantener un Fixed Timestep bajo sin sacrificar la fluidez visual.
Otro parámetro crítico es el 'Solver Iterations Count'. PhysX utiliza un método iterativo para resolver colisiones y joints (Gauss-Seidel). Por defecto, Unity usa 6 iteraciones de posición y 1 de velocidad. En sistemas complejos como ragdolls o puentes colgantes, aumentar las iteraciones de posición mejora la estabilidad y reduce la 'explosión' de joints, pero a un coste lineal de CPU. Un ingeniero debe profilar la escena usando el Physics Debugger y el Profiler de Unity para identificar si el tiempo se consume en el 'Physics.Simulate' o en la sincronización de transforms ('Physics.SyncTransforms').
El uso de 'Layer-based Collision Detection' permite reducir los pares de colisión potenciales. En un entorno con 1000 objetos, el peor escenario es N^2 comparaciones (1,000,000). Mediante el uso de capas estratégicas (p. ej., descartar colisiones entre proyectiles aliados o entre follaje y triggers), se puede reducir este número a una fracción, manteniendo la complejidad de la Broadphase en niveles manejables para hardware móvil o consolas de anterior generación.
// Ejemplo de optimización de Query Física mediante RaycastCommand para ejecución en Jobs
using Unity.Collections;
using Unity.Jobs;
using UnityEngine;
public class PhysicsOptimizationExample : MonoBehaviour {
void Update() {
var results = new NativeArray<RaycastHit>(1, Allocator.TempJob);
var commands = new NativeArray<RaycastCommand>(1, Allocator.TempJob);
// Definir comando de raycast para procesar fuera del main thread
commands[0] = new RaycastCommand(transform.position, transform.forward, 100f);
// Programar el Job de física
JobHandle handle = RaycastCommand.ScheduleBatch(commands, results, 1, default);
handle.Complete();
if (results[0].collider != null) {
// Lógica de impacto
}
results.Dispose();
commands.Dispose();
}
}Cardan Edge: Errores Críticos y Vicios de Producción
Uno de los errores más persistentes en estudios de nivel medio es el uso indiscriminado de 'Auto Sync Transforms'. En proyectos grandes, Unity sincroniza automáticamente cada cambio de posición de un Transform con PhysX antes de realizar un Raycast o un paso de física. Esto es costoso. Un ingeniero de élite desactiva 'Physics.autoSyncTransforms' y llama manualmente a 'Physics.SyncTransforms()' solo cuando es estrictamente necesario, agrupando las actualizaciones de posición para evitar múltiples reconstrucciones del árbol espacial por frame.
Otro vicio común es el escalado de Rigidbodies en tiempo de ejecución. Cambiar el 'localScale' de un objeto con un Collider obliga a PhysX a recalcular el volumen de colisión y el tensor de inercia. Si el escalado es inevitable, es preferible utilizar un escalado uniforme. El escalado no uniforme invalida muchas optimizaciones internas del motor y puede causar artefactos en la resolución de colisiones, como objetos que 'atraviesan' paredes debido a errores de precisión en el cálculo de normales.
Finalmente, el abuso de 'Mesh Colliders' incluso con la opción 'Convex' activada es una señal de falta de rigor técnico. Aunque PhysX 4.1 introdujo mejoras en la generación de convex hulls, una combinación de Box, Sphere y Capsule Colliders siempre será más rápida. La razón es matemática: la intersección entre una esfera y una cápsula es una fórmula analítica simple; la intersección entre dos mallas requiere iteraciones sobre estructuras de datos de vértices.
Análisis Comparativo: PhysX vs. Havok vs. DOTS Physics
En el ecosistema Unity, PhysX sigue siendo el estándar por su integración profunda y facilidad de uso. Sin embargo, para simulaciones de escala masiva (miles de agentes dinámicos), Unity Physics (basado en el motor Jolt) bajo la arquitectura DOTS (Data-Oriented Technology Stack) ofrece un rendimiento superior al eliminar la sobrecarga de los GameObjects y ser puramente multihilo por diseño. A diferencia de PhysX, que es un motor con estado (stateful), Unity Physics es stateless, lo que facilita enormemente el determinismo en juegos multijugador.
Havok Physics, disponible como un addon premium para Unity, ofrece una resolución de restricciones mucho más estable para sistemas mecánicos complejos. Mientras PhysX puede presentar vibraciones ('jittering') en pilas de objetos altas, Havok utiliza algoritmos de resolución avanzados que garantizan estabilidad sin aumentar drásticamente el número de iteraciones. No obstante, para el 95% de los títulos comerciales, PhysX 4.1, si se gestiona con las directrices de optimización aquí descritas, es más que capaz de ofrecer una experiencia AAA.
Veredicto del Director Técnico
La física en Unity no debe ser tratada como una caja negra. La diferencia entre una simulación mediocre y una de alto rendimiento radica en el control total sobre la Collision Matrix, la priorización de geometrías primitivas y la gestión consciente del FixedUpdate. No permita que los Static Colliders se muevan sin un Rigidbody Kinematic, y perfile siempre su Broadphase. En Instituto Cardan, exigimos que cada actor físico en la escena justifique su coste en el frame budget.