Cual es la forma correcta de calcular los FPS???

Saludos!!!

Bueno, como dice el titulo del post, pregunto cual es la forma correcta de calcular los FPS de un juego??? la verdad es que los estoy calculando (o intentando hacerlo XD) pero no se si es una manera correcta, es decir si los FPS que me esta presentado son los reales, he investigado pero no me queda muy claro, ademas si es posible me gustaria que me dijeran si la manera en que estoy limitando los FPS (si es que mi manera de calcularlos es correcta XD) esta bien implementada.

el loop principal de mi juego es parecido a esto (esta hecho en C con SDL, aunque no creo que esto sea relevante para la forma de calcular los FPS, o si???)

while(corriendo)
       {
             timeNow = SDL_GetTicks();  //para el calculo de los fps
        fpsNow,fpsPrev = SDL_GetTicks();    //para limitar los fps
             ....
             lectura de controles;
             calculo de posiciones;
             calculo de colisiones;
             bliteo en buffer;
             imprimir variable fps;
             determinar si se ha terminado el juego;
             flip a pantalla;
             
               //calculo fps

      if( timeNow - timePrev > 1000 )

         {

            timePrev = timeNow;

            fps = temp;

            temp=0.0;

         }

         

      //frame lock

      while(fpsNow - fpsPrev < 25)

             {

            fpsNow = SDL_GetTicks();

             }

      temp++;

   }
Una forma rápida aunque no 100% precisa (porque también influyen otras cosas), es la de 1/DeltaT, donde DeltaT es la diferencia en segundos(con decimales, bien float, fixed o double) entre un frame y otro.
Para qué necesitas exactamente la limitación de frames?
Meeths escribió:Una forma rápida aunque no 100% precisa (porque también influyen otras cosas), es la de 1/DeltaT, donde DeltaT es la diferencia en segundos(con decimales, bien float, fixed o double) entre un frame y otro.
Para qué necesitas exactamente la limitación de frames?


Gracias por responde,

Sabes, la manera que describes me da iguales resultados que la manera que lo he estado haciendo, pero con la diferencia que de esta manera (la que dices tu) me ahorro una variable y todo un IF, sin decir que me es mucho mas comoda.

Quiero limitar los frames porque estoy programando mi juego para PSP (se me olvido decirlo en mi primer post XD), pero luego de terminarlo quiero portarlo a PC, y como la diferencia de velocidades de procesador es tan amplia (entre PSP y las PC modernas), prefiero configurar todos los valores a un framerate especifico; para luego no tener que estar cambiando valores cuando este haciendo el port y asi tener ambas versiones lo mas parecidas posibles (creo que eso es lo que se hace en este tipo de casos no???).
Puedes hacer frameskips fácilmente usando algo así:

DeltaTMax = 1 / FPSDeseados 
DeltaTAcumulada += DeltaT
while(DeltaTAcumulada > DeltaTMax)
{
     DeltaTAcumulada -= DeltaTMax
      ...
     ActualizaTusCosas(DetaTMax)
}


Con eso Haces skips a una DeltaT fija y recuperas updates a la misma DeltaT cuando tengas un bajón de frames.
Espero que te sirva :)

Edito:
Si programas tu jueguete para que todo dependa de tiempo (ir pasando la famosa DeltaT por los diferentes componentes) usando velocidades en lugar de incrementos de posición, etc, poco importará la velocidad del procesador para que tu juego se desasrrolle a la misma velocidad en un a plataforma u otra, olvidándote de frameskips :)
Lo de programar en base al tiempo o velocidades no lo he pillado muy bien del todo XD, o sea el concepto lo tengo claro, lo que no pillo es como puedo implementarlo en el juego, a ver, lo que deberia hacer es calcular el tiempo entre un frame y otro y poner una condicion, suponiendo, de que si ha pasado medio segundo (o la cantidad apropiada segun vaya probando) se mueva X cantidad de pixeles??? supongo que haciendo algo asi no tendria que hacerle un delay al ciclo, verdad??? pero que pasa con el calculo de colisiones, le hago lo mismo o dejo que se calculen de todas formas???

Disculpenme si hago muchas preguntas, es que quiero que quede lo mejor posible XD, ademas la experiencia previa que tengo sobre programar juegos es de un ide de esos que hacen casi todo por ti.
Ok por lo que veo necesitarías algo así:
-Convertir los ticks a milisegundos (seguramente el SDK te aporte alguna macro o función para obtener eso)
-Obtener siempre la diferencia en milisegundos de un frame a otro (DeltaT o como lo quieras llamar)
-Usar este tiempo para actualizar tu mundo, por ejemplo:
En lugar de mover tus objetos en una cantidad fija de desplazamiento, usa la fórmula velocidad*tiempo, donde el tiempo ya lo has obtenido (DeltaT), y la velocidad la pones tú segun lo que quieras hacer

Así, para todas las partes de tu código donde puedas tener el problema de los FPS

Espero que te aclare algo :)
6 respuestas