Foros del Web » Programación para mayores de 30 ;) » Programación General »

Problema con el tiempo en C

Estas en el tema de Problema con el tiempo en C en el foro de Programación General en Foros del Web. Hola. Bueno, hice una aplicacion que cada 60 frames cheque si ha pasado un segundo(1000 milisegundos) y si no lo ha hecho, espere hasta que ...
  #1 (permalink)  
Antiguo 13/02/2005, 08:39
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
Problema con el tiempo en C

Hola.
Bueno, hice una aplicacion que cada 60 frames cheque si ha pasado un segundo(1000 milisegundos) y si no lo ha hecho, espere hasta que hayan pasado.

Bueno, entonce hice esto:

Al principio puso una variable int time1 que va a contener el tiempo inicial.

y use la funcion GetTickCount de windows para saber cuantos milisegundos han pasado desde que inicio windows.

Bueno, en una parte intermetia puse algo asi.

while(GetTickCount<time1+60)
{
;
}

y pues me alenta mucho la aplicacion. lo curiosos fue lo que hice despues.

if(tecla_presionada)
{
while(Get...).......
}

entonces cada vez que presionaba la tecla pues se aceleraba demasiado, per si no estaba presionada se alenta demasiad.

He intentado usar time+1, +10, +1000 en el while, pero todos hacen los mismo, me alentan igual que 1 o 1000.
Alguien sabe porque????

Quisiera que me ayudaran a ver si existe una mejor funciona para calcular los milisegundos.

Saludos
  #2 (permalink)  
Antiguo 13/02/2005, 09:50
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Con 60 te esperaria 60/1000 segundos, no creo que notes ninguna diferencia en tiempos menores a un segundo, son imperceptibles por lo menos para mi. Pero entre 60 y 1000 hay una diferencia clara.

Yo haria algo asi:

Código:
DWORD Ahora = GetTickCount();
Ahora += 1000;

while(Ahora > GetTickCount())
{

}
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO

Última edición por Eternal Idol; 13/02/2005 a las 10:01
  #3 (permalink)  
Antiguo 13/02/2005, 11:03
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
lo que sucede es que mi aplicacion deberia trabajar a 59.7 frames sobre segundo. y pues calculandole al tanteo anda entr los 80 y 100 frames sobre segundo.
Por eso es que quiero retrasarlo un poco.
Aparte esto de los milisegundos esta en un buble infinito.
Quiero decir que es tan rapida la aplicacion que si se nota el minimo cambio.

Saludos
  #4 (permalink)  
Antiguo 13/02/2005, 12:00
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
De cualquier manera no deberias utilizar 60, eso seria la unidad de FPS y no la unidad de tiempo transcurrido.

Código:
DWORD Ahora = GetTickCount();
Ahora += 1000;

while(Ahora > GetTickCount())
{
  if (FPS > 59) { break; }
}
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #5 (permalink)  
Antiguo 13/02/2005, 12:28
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
Bueno, eso funcionarria expto por un detalle.

Lo unico que se es que ya han paso 59.7 frames, no puedo saber cuando esta a cuanto.

En pocas palabras el retraso se realiza cada 60 frames. Lo ideal podria retrasar un segundo.
quien sabe.

Saludos
  #6 (permalink)  
Antiguo 13/02/2005, 12:51
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
En realidad tendrias que implementar la comprobacion de retraso en la misma funcion donde se pinta cada uno de los frames.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #7 (permalink)  
Antiguo 13/02/2005, 16:43
 
Fecha de Ingreso: noviembre-2003
Ubicación: Mexico
Mensajes: 1.081
Antigüedad: 20 años, 5 meses
Puntos: 7
espero que esto te sirva:

Código:
float g_FrameInterval = 0.0f;

//////////////////////////////////////////////////////////////
//     Calcula los frames por segundo (FPS)					//
//////////////////////////////////////////////////////////////
void CalculateFrameRate()
{
	static float framesPerSecond    = 0.0f;		// Inicializamos nuestro FPS
    static float lastTime			= 0.0f;		// Contiene el tiempo del ultimo frame
	static char strFrameRate[50] = {0};			// Aqui podemos cambiar el titulo de la ventana
	static float frameTime = 0.0f;				// Contiene el tiempo del ultimo frame

	// obtenemos el timpo en segundos con la funcion predeterminada
    float currentTime = timeGetTime() * 0.001f;				

	// aqui obtenemos el intervalo de tiempo para nuestras funciones
	//luego lo guardamos en nuestra variable estatica
 	g_FrameInterval = currentTime - frameTime;
	frameTime = currentTime;


	// incrementa el contador de frames
    ++framesPerSecond;

	// aqui restamos el tiempo actual, menos el ultimo tiempo que fue obtenido
	// para ver si el intervalo de tiempo paso de un segundo, y encontrar nuestro FPS
    if( currentTime - lastTime > 1.0f )
    {
		// el ultimo tiempo sera igual al tiempo actual
	    lastTime = currentTime;
		
		// FPS los pasamos a un string para mostrarlos en el titulo de la ventana
		sprintf(strFrameRate, "FPS:  %d", int(framesPerSecond));

		// Mostramos el titulo en la ventana
		
		SDL_WM_SetCaption(strFrameRate, NULL);

		// Reseteamos el contador
        framesPerSecond = 0;
    }
	
}
y ahora por ejemplo, cuando presiones una tecla para mover algo:
suponiendo que se mueve con cierta velocidad:
tendria que ser algo asI.
if(tecla presionada)
muevealgo *= g_FrameInterval = 0.0f;


EDIT***
jejeje, por cierto, en lugar de estO.
SDL_WM_SetCaption(strFrameRate, NULL);
pon su equivalente con la API de windows (o la que te estes usando para manejar ventanas) (muestra los fps en la ventana)

Última edición por blackwind; 13/02/2005 a las 16:44
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:08.