He leído que la velocidad de los objetos del juego no debe verse obstaculizada por FPS, sino que debe basarse en el tiempo. ¿Cómo puedo separar el código de actualización / dibujo para maximizar el rendimiento sin limitar la velocidad de dibujo y proporcionar una velocidad de actualización lógica constante basada en el tiempo?
Mi pseudocódigo actual es el siguiente
loop
{
draw();
if (ticksElapsed() > 100)
{
update();
ticks+= ticksElapsed();
}
}
El problema es que el código de dibujo dificulta el rendimiento de la tasa de actualización (). Y consume 100% de CPU porque si se le duerme, se liberan ambas funciones de dibujo / lógica.
También estoy usando SDL y no parece tener una opción vsync. También he oído hablar de los términos fijo y variable, sin embargo, no estoy seguro de cómo se puede hacer con el sueño ()
sdl
frame-rate
logic
fixed-timestep
Oskenso Kashi
fuente
fuente
Respuestas:
En su fragmento de código, parece que está intentando ejecutar su juego en modo de paso de tiempo fijo esperando ocupado si su dibujo y actualización tomó menos de 15 ms (60 fps). Esto es posible y has acertado al decir que esto no se puede hacer usando una llamada de suspensión porque no sabes exactamente cuánto tiempo vas a dormir. El ocupado-esperando-loop es la buena solución.
Sin embargo, considere el caso en el que su actualización y dibujo superan los 15 ms, ahora tiene el dibujo y la actualización del juego más lentos. Ahora puede hacer dos cosas: detectar este estado y soltar cuadros (omitir el dibujo y pasar directamente a la actualización hasta que esté sincronizado nuevamente), sin embargo, si la computadora está lenta, nunca se pondrá al día.
Otra solución es hacer que su lógica de actualización sea independiente del tiempo fijo. No necesita un hilo separado para esto, solo tiene que respetar lo rápido que deberían moverse las cosas. En lugar de 5 píxeles por marca, debe usar 50 píxeles por segundo. Necesitaría un temporizador de alta precisión para lograr esto, y toda su lógica de actualización debería poder acceder al temporizador para ver cuánto tiempo pasó desde la última actualización.
Básicamente vas de:
A
fuente