SamL
(usa XUbuntu)
Enviado em 01/03/2022 - 18:59h
O FPS é medido conforme a quantidade de updates executado por segundo.
Por exemplo:
Se tu tem um código onde ele desenha na tela e então espera com o sleep por 0.033 segundos, então, tu tem um FPS de 1 / 0.033 ou quase 30 frames por segundo.
0.033 = tempo em segundos
1 = quantidade mínima de frames desenhados em 1 segundo
Pode ser que esse valor varie conforme a frequencia do monitor, já que, precisaria sincronizar manualmente os updates com a frequencia do monitor.
Então se teu monitor tem taxa de updates igual a 60 Hz, será 60 updates por segundo que serão vistos na tela. Mas se teu jogo tem o FPS abaixo ou acima de 60Hz, somente 60 frames serão de fato vistos.
Pra calcular oFPS atual, é preciso saber qual foi o tempo no inicio do loop e o tempo no final do update.
Por exemplo em C com SDL2:
while (1) {
Uint32 tempo_inicial = SDL_GetTicks();//pega o tempo agora, tempo em milissegundos
//aqui vem a lógica do jogo
//depois da lógica, vem o controle de FPS
Uint32 tempo_decorrido = SDL_GetTicks() - tempo_inicial;
//agora verifica se está executando muito rápido o jogo
if (tempo_decorrido < 33) {
//como estamos aqui, é porque o jogo tá rodando muito rápido e vai ocorrer variação no FPS
//essa diferença é a que devemos esperar um pouco
Uint32 diff = 33 - tempo_decorrido;
//agora espera o tempo que faltou para ser 33 ms
SDL_Delay(diff);
}
else {
//faz esperar 1 milissegundo para a cota do processador (pra não executar com 100% de processamento)
SDL_Delay(1);
}
}
SDL_Delay é o mesmo que sleep em shell.
SDL_GetTicks é apenas um número que indica quanto tempo passou desde o inicio do programa, pode ser substituido por uma função ou comando que retorne a quantidade dde tempo em milissegundos que o programa está executando.
Ali onde tem o diff, para saber o FPS atual, basta fazer FPS = 1 / (tempo_decorrido / 1000.0), onde o FPS é uma variável numérica.
Esse é um controle simples de FPS.