Digamos que você queira limitar a taxa de quadros a 60 qps, isso significa que todo quadro tem um tempo de renderização de 1 / 60s = 16,67ms (arredondado)
Para limitar sua taxa de quadros, basta verificar o horário no início do loop do jogo, e então compará-lo com o horário no final do loop do jogo: se a diferença for menor que 16,67ms, você deve parar por esse tempo.
Uma maneira de fazer isso é usar:
sleep(waittime)
No entanto, como sleep(x)
produz o encadeamento por um mínimo de x
milissegundos, você não sabe ao certo se conseguirá o controle novamente no tempo.
Uma maneira melhor seria usar:
while(timediff < 16.67ms){ sleep(0); }
Isso gera o encadeamento e solicita o controle de volta o mais rápido possível.
Outra solução é ter apenas um loop de espera ocupado, isso oferece o melhor controle, mas usa a CPU desnecessariamente.
Lembre-se de que o agendador do sistema operacional sempre pode tirar o controle do seu encadeamento, portanto, esteja preparado para alguma flutuação.