Tutorial de SDL – Parte 24 – Calculando o Frame Rate

Continuando nossa série de artigos traduzidos do site lazyfoo, e agora que sabemos como criar um timer, chegou a hora de usar esse recurso para calcular o fps.

//Main loop flag
bool quit = false;
//Event handler
SDL_Event e;
//Set text color as black
SDL_Color textColor = { 0, 0, 0, 255 };
//The frames per second timer
LTimer fpsTimer;
//In memory text stream
std::stringstream timeText;
//Start counting frames per second
int countedFrames = 0;
fpsTimer.start();
Para podermos calcular o frame rate, precisamos ter registro do número de frames renderizados e do número de segundo que se passaram. Antes de entrarmos no loop principal, iniciamos um timer que será usado para calcular o fps e declaramos uma variável para manter um registro do número de frames renderizados.
//Calculate and correct fps
float avgFPS = countedFrames / ( fpsTimer.getTicks() / 1000.f );
if( avgFPS > 2000000 )
{
   avgFPS = 0;
}
Para calcular o número de frames por segundo, você precisa pegar o número de frames renderizados e dividir pelo número de segundo que se passaram. Temos que levar em consideraão que é possível que pouco tempo tenha se passado para renderizar o primeiro frame e isso pode nos dar um número muito alto para o fps. Por isso devemos corrigir o valor se for muito alto.
//Set text to be rendered
timeText.str( "" );
timeText << "Average Frames Per Second " << avgFPS;
//Render text
if( !gFPSTextTexture.loadFromRenderedText( timeText.str().c_str(), textColor ) )
{
   printf( "Unable to render FPS texture!\n" );
}
//Clear screen
SDL_SetRenderDrawColor( gRenderer, 0xFF, 0xFF, 0xFF, 0xFF );
SDL_RenderClear( gRenderer );
//Render textures
gFPSTextTexture.render( ( SCREEN_WIDTH - gFPSTextTexture.getWidth() ) / 2, ( SCREEN_HEIGHT - gFPSTextTexture.getHeight() ) / 2 );
//Update screen
SDL_RenderPresent( gRenderer );
++countedFrames;

Depois de calcularmos o fps, renderizamos o valor como uma textura na tela. Depois que tivermos renderizado a cena, incrementamos o contador de frames.

Como esse programa é vsynced, provavelmente irá reportar 60 fps. Se quiser saber qual a capacidade de seu hardware, somente crie um renderizador sem vsync.

Baixe os arquivo de código fonte do exemplo desse artigo aqui.