Tras una pausa, el juego intenta recuperar de golpe los cálculos atrasados, y esos mismos cálculos lo vuelven a retrasar.
Por qué La simulación del juego corre a un intervalo fijo y se detiene una vez → Efecto Todos los pasos atrasados se calculan en un solo frame → En pantalla Se encadenan frames largos con picos, o al topar con el límite el mundo se ralentiza
De vez en cuando, al azar, Cuando se junta mucha gente
Responsable
Responsable principal Desarrollo de cliente (Equipo de desarrollo)
Tareas (Equipo de desarrollo)
Limitar la recuperación por frame, resolver el tiempo sobrante con interpolación.
En el gráfico
Picos aleatorios · Tiempo de frame, pasos fijos por frame
Dónde mirar
En el profiler de una build de desarrollo, ver junto con el tiempo de frame cuántas veces se ejecutó el paso fijo en un frame (en Unity, el número de marcadores de la fase FixedUpdate, como FixedBehaviourUpdate)
Se confirma si
Tras un frame largo se encadenan otros frames largos que ejecutan varios pasos, y al alcanzar el límite (Maximum Allowed Timestep en Unity) el tiempo del juego avanza más despacio que el real
Se descarta si
Si el frame largo es uno solo: “Pico de frametime” o “Recolección de basura (GC) en el cliente”
Se verifica con
Requiere logs y métricas del servidor o el cliente del juego
Para saber más
La física de Unity (FixedUpdate) es el ejemplo típico de paso fijo (0.02 s por defecto, 50 veces por segundo). Maximum Allowed Timestep, en la configuración de Time (el tiempo máximo que se recupera en un frame, unos 0.33 s por defecto), es el límite de recuperación. Si un frame dura más que eso, el tiempo sobrante se descarta y el reloj del juego se queda atrás del real en esa misma cantidad.
Handling variation in timeUnity Valor predeterminado de Maximum Allowed Timestep: 1/3 s (0.3333333); aunque el juego se detenga 1 segundo, el tiempo del juego solo avanza 0.333 s; es el límite que corta el círculo vicioso en que los pasos de recuperación vuelven a ralentizar el juego
Profiler markers referenceUnity FixedBehaviourUpdate: tramo de ejecución de MonoBehaviour.FixedUpdate; los marcadores de física se llaman en la fase FixedUpdate