PDA

Ver la versión completa : Como consultar el número de nanosegundos transcurridos



Theck
26/06/2008, 19:08
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

efegea
26/06/2008, 19:12
&#191;Te valen microsegundos?

Theck
26/06/2008, 19:26
Siempre es mejor que nada, y si luego sale algo mejor cambiarlo es relativamente sencillo ^^

efegea
26/06/2008, 19:28
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, &#191;o este? no, &#233;ste....

juanvvc
26/06/2008, 21:05
Un ejemplo con gettimeofday y microsegundos (que son m&#225;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&#237;:



void *timer = new_timer();

while(playing)
{
int han_pasado;
...
han_pasado = time_elapsed(&timer);
...
han_pasado = time_elapsed(&timer);
...
}
free(timer);

joanvr
26/06/2008, 23:16
Microsegundos es suficiente para cualquier cosa. Los ticks de la gp2x no tienen tanta precision para llegar a nanosegundos creo.

juanvvc
27/06/2008, 13:48
Corrijo un poco el c&#243;digo que hab&#237;a puesto despu&#233;s de probarlo, y corrijo tambi&#233;n mi tonter&#237;as sobre las unidades: como dice joanvr, microsegundos es bastante para cualquier cosa. De hecho, si pruebas el c&#243;digo anterior ver&#225;s que solo es &#250;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&#225;s exactos, donde se accede directamente al reloj de la Gp2x, est&#225; en la minimal lib de Rlyeh, funci&#243;n gp2x_timer_read().

Obviamente, con un reloj a 200MHz no se puede alcanzar la precisi&#243;n de nanosegundos :)