Saltar al contenido

¿Cómo hacer un contador de FPS básico?

Necesitamos tu ayuda para compartir nuestros ensayos sobre las ciencias de la computación.

Solución:

Tienes que muestrear 2 intervalos de tiempo diferentes usando clock()
sin embargo señala que hay varios problemas:

  • la resolución del reloj es de varios milisegundos (puede solucionar el problema usando std::chrono, etc., sin embargo, incluso el crono puede no tener una resolución tan alta dependiendo de la implementación. En mi PC con GCC 4.9.1 nunca obtengo una resolución mejor que 16 milisegundos, incluso con std: :crono.
  • típicamente usando clock() te saldrá 0 muchas veces y en algún momento medirás un tiempo real (en mi caso solo da un salto de 15/16 milisegundos)
  • a menos que esté utilizando la sincronización vertical (vsync), no medirá el tiempo de cuadro real, sino solo el tiempo de CPU empleado en su ciclo de renderizado (para activar vsync, debe establecer SetSwapInterval (1) con la función de su sistema operativo o, por ejemplo, usar una biblioteca como SDL que proporcionar implementación de plataforma cruzada portátil)
  • Para medir el tiempo de procesamiento real, puede usar una consulta de tiempo de GL (puede tener solo 1 temporizador vinculado en cualquier momento, por lo que si está midiendo la velocidad de fotogramas, no puede medir cuánto tiempo lleva procesar algo específico).
  • No mida FPS (bueno, a menos que solo quiera mostrárselo a los usuarios), en su lugar, mida el tiempo de cuadro en milisegundos, lo que brinda una aproximación mucho más intuitiva del rendimiento. (usted sabe que pasar de 100 a 80 FPS es una diferencia de 2,5 ms, ¡pasar de 40 a 20 FPS es una diferencia de 25 ms!)

Haz eso:

double clockToMilliseconds(clock_t ticks)
    // units/(units/time) => time (seconds) * 1000 = milliseconds
    return (ticks/(double)CLOCKS_PER_SEC)*1000.0;

//...

clock_t deltaTime = 0;
unsigned int frames = 0;
double  frameRate = 30;
double  averageFrameTimeMilliseconds = 33.333;

while(rendering)

    clock_t beginFrame = clock();
    render();
    clock_t endFrame = clock();

    deltaTime += endFrame - beginFrame;
    frames ++;

    //if you really want FPS
    if( clockToMilliseconds(deltaTime)>1000.0) //every second
        frameRate = (double)frames*0.5 +  frameRate*0.5; //more stable
        frames = 0;
        deltaTime -= CLOCKS_PER_SEC;
        averageFrameTimeMilliseconds  = 1000.0/(frameRate==0?0.001:frameRate);

        if(vsync)
            std::cout<<"FrameTime was:"<

El código anterior también funciona cuando haces algo que lleva varios segundos. Hago un cálculo que se actualiza cada segundo, también podría actualizarlo más a menudo. (nota que uso exactamente ese código en la mayoría de mis proyectos que necesitan FPS)

Simplemente guarde los "ticks" de tiempo antes y después de renderizar su escena, luego haga un cálculo simple.

He aquí un ejemplo que utiliza 's clock() función. (tenga en cuenta que clock() funciona de manera diferente en diferentes plataformas)

clock_t current_ticks, delta_ticks;
clock_t fps = 0;
while(true)// your main loop. could also be the idle() function in glut or whatever

    current_ticks = clock();

    render();

    delta_ticks = clock() - current_ticks; //the time, in ms, that took to render the scene
    if(delta_ticks > 0)
        fps = CLOCKS_PER_SEC / delta_ticks;
    cout << fps << endl;

valoraciones y reseñas

Si posees algún titubeo y disposición de afinar nuestro crónica te inspiramos escribir una acotación y con deseo lo estudiaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *