te comento mi forma de sincronizar los FPS (frames por segundo)
lo ideal es separar el render de la logica de la aplicacion, por lo cual tendras dos rutinas: una que se llama update_logica() y otra que se llame render() esto te permitira incluso hacer que las actualizaciones de logica sean mas a menudo que el render (por ejemplo, en un juego de simulacion de coches, actualizas la logica cada 10msec, pero dibujas cada 60msec, lo cual te permite tener un control mucho mayor de las fisicas).
te pongo un algoritmo basico, que actualiza las fisicas a la misma velocidad de los fps:
#define FPS 60
#define NEXTFRAMELAPSE 1000/FPS //cuantos milisegundos entre frames?
#define MAXFRAMESKIP 20 //estoy dispuesto a saltarme 20 frames si no me da tiempo, pero ni uno mas
next_frame=get_current_milisec()+NEXTFRAMELAPSE; //no recuerdo con exactitud la funcion exacta, pero creo que se entiende
frame_skip=0;
while(1)
{
if(get_current_milisec()>next_frame) //o sea, nos toca trabajar?
{
next_frame=next_frame+NEXTFRAMELAPSE; //para saber cuando nos tocara currar de nuevo
update_logica(); //la logica la tenemos que actualizar por cojones
if (get_current_milisec()>next_frame && frame_skip<MAXFRAMESKIP)
{
//si entramos aqui, es que no nos da tiempo a dibujar porque ya deberiamos estar en el otro frame
//y ademas, aun estamos dentro de los frames permitidos que nos podemos 'comer'
frame_skip++;
}
else
{
//si entramos aqui, o bien aun estamos en tiempo de dibujar, o bien tenemos que plantar un frame por cojones
render();
frame_skip=0;
}
}
}
este algoritmo se puede mejorar para que la fisica sea 'refrescada' mas veces que los fps a mostrar.
tambien se puede hacer un algortimo que intente sacar el numero maximo de 'renders' por segundo y que no este limitado a unos FPS prefijados, pero en tal caso, deberas 'arquitecturar' tu rutina de 'update_logica()' para que pasandole el tiempo que ha pasado desde el frame anterior al actual, actualice la logica en consonancia.