Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Calcular Frames por segundo

Iniciado por CoLSoN2, 11 de Noviembre de 2002, 01:26:15 AM

« anterior - próximo »

CoLSoN2

                                Vereis, tengo el siguiente codigo para calcular FPS:


float W3C_APP_Game::GetFPS()

{

unsigned long time,delay;

time = GetTickCount();

delay = time - oldTime;

oldTime = time;



return 1000.0/(double)delay;

}


y el resultado de esto, a cada frame, lo loggeo. Y siempre es 50 o 100.
Osea, el log es algo asi:
50
100
100
50
50
50
100
50
100
50
50
...

Y no se que falla. ¿que utilizais vosotros?                                
Manuel F. Lara
Descargar juegos indie  - blog sobre juegos indie y casual
El Desarrollo Personal.com  - blog sobre productividad, motivación y espíritu emprendedor

sés

                                Pos no hay nada raro. Ese es el refresco de tu monitor: 50Hz
A veces el proceso te lleva más tiempo y la función se ejecuta en el siguiente refresco, por eso sale 100.                                
Soy indeciso... ¿o no?

[Over]

                                Hola.

Yo los calculo asi:

void CRenderDevice::DisplayFPS()
{
 DWORD dwCurrentTime = GetTickCount();

 m_dwFPS++;

 if ((dwCurrentTime - m_dwLastTime) > 1000)
 {
   char szFPS[90];
   sprintf(szFPS, "%d FPS", m_dwFPS);
   SetWindowText(m_hwnd, szFPS);

   m_dwLastTime = dwCurrentTime;
   m_dwFPS      = 0;
 }
}

Yo lo muestro en la ventanita, pero vaya, tu sacalo donde te de la gana.

PD: A lo mejor hay otra manera mas chula y elegante, pero tampoco te marees calculando los fps de tu aplicacion, mientras supere lo necesario.

Chao.                                

Ithaqua

                                El problema no es el refresco (y dudo mucho que alguien trabaje con un monitor a 50hz ;-) ), sino la frecuencia de actualización del valor que te da la función.

Según la MSDN:

"The GetCurrentTime() and GetTickCount() functions are identical. Each returns the number of milliseconds (+/- 55 milliseconds) since the user started Windows, and the return value of each function is declared to be a DWORD"

Así que lo más probable es que la función que usas no tiene la resolución suficiente como para usarla en un cálculo de FPS (1/20 de segundo).

Usa QueryPerformanceCounter() junto con QueryPerformanceFrecuency().                                
thaqua^Stravaganza
http://ithaqua.stravaganza.org

CoLSoN2

                                sigo usando GetTickcount, pero aora si ke se limita a los Hz.. se keda siempre en 60-61. Y si subo la frec. del monitor a 85, pos en 85. alguna vez oi que habia que tocar algo en la config de la tarjeta grafica (active desktop > propiedades > configuracion > avanzadas ..) alguien sabe? tengo una nvidia gforce 4 ti 4200                                
Manuel F. Lara
Descargar juegos indie  - blog sobre juegos indie y casual
El Desarrollo Personal.com  - blog sobre productividad, motivación y espíritu emprendedor

Loover

                                Yo uso la misma funcion que over, y pasa una cosa curiosa. En mi cada da unos fps (unos 200 o por ahi pero variando de 10 en 10) con una Radeon y en casa de un colega da 75 clavados (con una gforce 2) q claramente coinciden con su refresco del monitor. Será por eso que ha dicho ithaqua?                                
IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!

Ithaqua

                                Suponiendo que se calculen bien los fps (la función de tiempo tiene resolución suficiente):

*Nota, significado de vsync más abajo.

-Si el vsync está activado y cada frame se renderiza más deprisa que el ratio de frecuencia del monitor, verás que los frames por segundo coinciden exactamente con ese velocidad de refresco (se renderiza un frame, y se espera a que termine el retrazo vertical, se renderiza, se espera, se renderiza...).
Si el frame se renderiza más despacio que la frecuencia del monitor, depende de lo despacio que se renderice, pero siempre ocurre el problema de que mientras que vamos calculando un frame termina un ciclo del monitor (o varios) y comienza otro, y en medio resulta que hemos terminado de pintar nuestro frame. Se tiene que esperar a que termine otro ciclo del monitor con la pérdida de un montón de tiempo (resultado: hzmonitor/n fps donde n es el número de ciclos del monitor que han transcurrido mientras que calculamos un frame).

-Si el vsync está desactivado no se espera a nada cuando hemos terminado de calcular un frame, se manda a pantalla y punto. El resultado de los fps serán los máximos que podremos conseguir a través de nuestro código, por lo que para medir la rapidez de nuestras rutinas siempre hay que mirar los fps sin vsync.

Si en un ordenador te da 80fps constantes y en otro 243, seguramente el primero tenga el vsync activado y el monitor funcionando a 80hz, mientras que el segundo tendrá el vsync desactivado y la rutina funcionando a todo trapo.

*vsync:

No se quien lo preguntó por ahí pero el vsync es simplemente una opción (que se puede activar/desactivar en los display settings), para que cuando acabemos de pintar un frame se espere a que termine el retrazado vertical del monitor de realizar un ciclo de actualización de la pantalla, antes de mandar esa información.
Con esto conseguimos que la actualización del monitor no se mezcle con la actualización de nuestro frame, lo que daría lugar a la aparición de pequeños parpadeos.
En definitiva, con el vsync activado la visualización es más 'suave'.                                
thaqua^Stravaganza
http://ithaqua.stravaganza.org

Ithaqua

                                Se me olvidaba explicar con lo anterior el caso concreto de la alternancia 100fps / 50fps:

Tienes el monitor funcionando a 100hz?

En ese caso puedes tener vsync activado y tu programa funciona a valores cercanos a 100fps, tanto por arriba como por abajo.
Si un frame se calcula algo más rápido, te dará 100, si se calcula algo más despacio, te dará 50. ¿Por qué? en el primer caso se calcula el frame, se espera (muy poquito) y se manda.
En el segundo caso se calcula el frame, pero al tardar un pelin más resulta que mientras tanto ha pasado un ciclo del monitor. Cuando hemos terminado, se espera al ciclo siguiente del monitor. Han transcurrido 2 ciclos de monitor, y al sincronizar con el segundo y calcular los fps el intervalo de tiempo ha sido de 2/100 por lo que te dará 50fps.                                
thaqua^Stravaganza
http://ithaqua.stravaganza.org

Loover

                                Cuando dices de activar/desactivar el vsync... ¿se puede hacer desde opengl o direct 3d? ¿Se puede hacer desde el sistema operativo? Sino es mucho pedir... ¿cómo se hace en los 3 casos?                                
IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!

Loover

                                Acabo de mirar en las opciones de mi tarjeta... "esperar sincronización vertical". Aja, ya se hacerlo desde el SO... ¿cómo se puede activar eso desde una api gráfica como opengl/direct3d?                                
IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!

Ithaqua

                                En D3D se puede hacer a través de la API. En OpenGL al menos con la API standard no se puede que yo sepa. Quizá con alguna extensión tipo la del pixel format (no recuerdo el nombre ahora mismo).                                
thaqua^Stravaganza
http://ithaqua.stravaganza.org

MChiz

                                Hola!

Para activar y desactivar el vsync desde OpenGL, se debe usar la extension "wglSwapIntervalEXT".
Y ya que estoy, que estos dias estaba en eso, en Direct3D8 se puede hacer a la hora de crear la ventana, pero... luego no se puede cambiar sin tener que volver a crear otra vez el objeto D3D, etc? He visto el metodo Reset, pero pierdes las texturas y demas cosas : ( es una bazofia. Recuerdo que en DX 5 ( supongo que en los siguientes y anteriores tambien ) habia un flag para esperar el vsync.
Gracias por la ayuda!
Un saludo!                                

CoLSoN2

                                tengo una GF4 Ti 4200 y por mas k busco no encuentro en la config de la tarjeta eso del vsync  : (kreo ke si, pero solo pa opengl, segun ponia)                                
Manuel F. Lara
Descargar juegos indie  - blog sobre juegos indie y casual
El Desarrollo Personal.com  - blog sobre productividad, motivación y espíritu emprendedor






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.