Ver la versión completa : Como consultar el número de nanosegundos transcurridos
Hola a tod@s,
Toy embarcado en una pequeño proyecto para la GP2X que ya veremos si acabas siendo un juego o solo un conjunto de líneas sin sentido >_<
La cosa es que necesito controlar cosillas con bastante precisión, es algo tipo DDR, o sea, de saber cuan preciso ha sido el jugador en pulsar comparado con cuando debería haber pulsado.
Veo que lo normal con SDL es usar el SDL_Getticks() pero he leído y me comentan que es una función que no es muy precisa, que viene filtrada por el SO y mejor no usarla si hay alguna alternativa.
Y a eso vengo, ¿en GP2X como puedo saber el número de nanosegundos transcurridos?
Muchas gracias y a ver si sale algo que sea divertido :D
¿Te valen microsegundos?
Siempre es mejor que nada, y si luego sale algo mejor cambiarlo es relativamente sencillo ^^
gettimeofday
#include <sys/time.h>
int gettimeofday(struct timeval *tv, struct timezone *tz);
struct timeval {
long tv_sec; /* segundos */
long tv_usec; /* microsegundos */
};
struct timezone {
int tz_minuteswest; /* minutos al O de Greenwich */
int tz_dsttime; /* tipo de correción horaria invierno/verano */
};
loixartx
26/06/2008, 19:36
Este es el mejor nanosegundo de mi vidaa, ¿o este? no, éste....
Un ejemplo con gettimeofday y microsegundos (que son más que suficientes para acciones humanas):
#include <sys/time.h>
void *new_timer()
{
struct timeval *tv;
tv = malloc(sizeof(struct timeval));
gettimeofday(tv, NULL);
return tv;
}
int time_elapsed(struct timeval *prev)
{
int secs, usecs;
struct timeval tv;
gettimeofday(&tv, NULL);
secs = tv.tv_sec - prev->tv_sec;
usecs = tv.tv_usec - prev->tv_usec;
prev->tv_usec = tv.tv_usec;
prev->tv_sec = tv.tv_sec;
if (!secs) return usecs;
return 1000000 + usecs;
}
Y lo usas tal que así:
void *timer = new_timer();
while(playing)
{
int han_pasado;
...
han_pasado = time_elapsed(&timer);
...
han_pasado = time_elapsed(&timer);
...
}
free(timer);
Microsegundos es suficiente para cualquier cosa. Los ticks de la gp2x no tienen tanta precision para llegar a nanosegundos creo.
Corrijo un poco el código que había puesto después de probarlo, y corrijo también mi tonterías sobre las unidades: como dice joanvr, microsegundos es bastante para cualquier cosa. De hecho, si pruebas el código anterior verás que solo es útil en milisegundos, que es suficiente para la entrada de usuario (el sistema nervioso humano funciona en el rango de milisegundos). Un ejemplo con microsegundos más exactos, donde se accede directamente al reloj de la Gp2x, está en la minimal lib de Rlyeh, función gp2x_timer_read().
Obviamente, con un reloj a 200MHz no se puede alcanzar la precisión de nanosegundos :)
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions Inc. All rights reserved.