Elegir un game loop¶
El game loop técnico gobierna la captura de entradas, el avance de la simulación y el render. Conviene distinguirlo del gameplay loop, que describe el ciclo de decisiones y recompensas que juega una persona.
Un error frecuente es permitir que la tasa de frames determine por accidente los resultados de la simulación. Un monitor rápido podría entonces cambiar el resultado de las colisiones, del daño o del movimiento.
Tres responsabilidades¶
flowchart TB
T["Medir tiempo real"] --> I["Capturar input"]
I --> Q["Encolar intenciones"]
Q --> S["Actualizar 0..N ticks"]
S --> P["Interpolar representación"]
P --> R["Renderizar frame"]
R --> T
El render puede ser variable y la simulación fija. Un paso fijo es especialmente relevante para físicas, replay, networking o reglas sensibles al tiempo; no es obligatorio para una interfaz sencilla.
Comparación de estrategias¶
| Estrategia | Cuándo conviene | Compromiso |
|---|---|---|
| Delta variable | Juegos pequeños y simulación tolerante | Los picos alteran la integración |
| Tick fijo | Física, sincronización, simular sin render | Hay que gestionar ticks atrasados |
| Híbrida | Render fluido con simulación estable | Mantener estados para interpolación |
Un bucle de tiempo fijo¶
accumulator += min(realDelta, maximumFrameDelta)
readInputIntoCommands()
steps = 0
while accumulator >= fixedDelta and steps < maxSteps:
simulation.tick(fixedDelta)
accumulator -= fixedDelta
steps += 1
alpha = accumulator / fixedDelta
presentation.render(interpolate(previous, current, alpha))
La cantidad máxima de pasos evita una espiral de retraso. Pero descartar tiempo, conservarlo o ralentizar la simulación son decisiones diferentes. Documentá esa política; para juegos de red o replays deterministas puede cambiar la corrección del sistema.
Orden, frecuencia y escalabilidad¶
El scheduler debe definir qué sistema produce datos y cuál los lee. Un ejemplo es: validar intenciones → movimiento/físicas → aplicar efectos → actualizar decisiones → publicar estado observable. El orden exacto depende del juego.
No todo debe ejecutarse en cada tick. Podés actualizar planificación estratégica, comercio y NPC distantes a menores frecuencias. Si hay concurrencia, declarás qué datos lee/escribe cada sistema antes de paralelizarlo.
Verificar¶
Medí tiempo por tick, p95, pasos por frame y deuda acumulada. Ejecutá una simulación headless durante una cantidad conocida de ticks. Si necesitás determinismo, controlá seeds, orden de iteración, puntos de lectura y fuentes externas: usar un delta fijo no es suficiente por sí solo.
Relacionado: Núcleo de simulación y scheduler, Intenciones, acciones y eventos, Probar la simulación y medir antes de optimizar y Tres topologías: local, host-and-play y servidor dedicado.
Referencia: Glenn Fiedler — Fix Your Timestep!.