Obtener el tiempo en milisegundos?

Started by KeiDash, November 03, 2017, 06:48:30 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

KeiDash

#30
Quote from: SplinterGU on March 19, 2018, 02:20:38 AM
Quote from: KeiDash on March 16, 2018, 01:14:38 PM
Quote from: SplinterGU on March 16, 2018, 11:56:39 AM
get_timer() son milisegundos desde que la aplicacion inicio

Representado por el reloj interno de la consola?

milisegundos son milisegundos... independientemente de lo que hagas o haga la consola o pc, o lo que sea... son milisegundos relativos a cuando se inicio el programa...

no entiendo tu pregunta...

Bueno pensandolo ahora mi propia pregunta no tiene sentido, como bien dices, milisegundos son milisegundos.

He conseguido trabajar con get_timer() y es muy certero en tiempo (al 100%) aunque no se si es mi solución para mi juego, es decir:

Mi juego muestra algo en pantalla cada X milisegundos (un sprite supongamos), pero hay muchos sprites que mostrar. Cada sprite tiene su tiempo en milisegundos asignado, entonces lo que hago es consultar el tiempo el un bucle para saber en qué momento debe el sprite aparecer, me explico:


Process MostrarSprite(int milisegundos, int spriteId)
Private
  int mytime = 0;
Begin
   myTime = get_timer() + milisegundos;

   Loop
      if(get_timer() >= myTime) break; End
      frame;
   End

   GRAPH = spriteId;
   X = xpos;
   Y = Ypos;
   .
   .
End


La cosa, problema o handicap es que, cuántos más sprites se empiezan a ver en pantalla, más lento empiezan a ir los procesos internamente y los sprites comienzan a tardar en salir...La verdad es que no se si esto tiene algún tipo de solución que pueda implementar

SplinterGU

quizas te convendria tener un proceso controller, donde verifique una estructura con tiempo + sprite (puede ser id de proceso sprite), tengas luego los procesos con los sprites dormidos previamente, y cuando el proceso controlador encuentra que tiene que activar un sprite, le actualiza sus coordenadas y los pone en freeze... asi consumiria menos proceso, en teoria... hay que ver cuanto tarda la logica del controller... que ademas solo haria un get_timer por frame... y deberia quitar de la lista o considerar el estado (congelado, dormido, etc...) en la logica del controlador, para no activarlo nuevamente...

no se, de momento se me ocurre eso
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

KeiDash

Pues lo tendré en cuenta Splinter, gracias por tu ayuda!

KeiDash

#33
Finalmente despues de muchas muchas pruebas, cálculos y formulas he llegado a la conclusión de que para calcular tu propio tiempo internamente en código o hacerte tu propio cronómetro, la mejor opción (y diría que única) es utilizar la función get_timer() como comenta SplinterGU, es muy precisa y da el tiempo perfectamente aunque desconozco internamente cómo funciona.

Al contrario que un bucle que recorra n ciclos ya sea controlado por los FPS o por una variable que se incremente, get_timer() da el tiempo justo y exacto (como el programa de la TV x'D) mientras que a través de un bucle siempre hay pérdidas, ya que el bucle funcionará a razón de la carga de trabajo del código, es decir, si el sistema se realentiza por lo que sea (mala codificación o una gran carga de datos en memoria) el bucle también se realentiza, dando tiempos impresisos y pérdidas de supuesto tiempo siempre. Ejemplo:

//60 ciclos de bucle = 1 segundo
For(i = 0; i < 60; i++)
   i++;
End


Este bucle nunca empezará y terminará en el mismo momento. podría empezar en el segundo 0.00 y terminar en el 0.62, en vez de en el 0.60

Comento esto por si alguno se ve en el mismo dilema aunque muchos digan que "es que es normal que si usas bucles pase eso" y si, es normal, pero cuando necesitas de verdad controlar el tiempo milimétricamente (Segúndos, Désimas, Centésimas y Milésimas) esto no te va a ayudar en absoluto. Recordemos cómo empezó este post.

Saludos y gracias a todos por ayudarme en este post.

Futu-block

ponme un ejemplo, porque me parece curioso y creo que lo voy a usar para los programas ''demo'' que se cierre y empiece de nuevo cuando leve una hora abierto :D
(que mala idea tengo, lol)

SplinterGU

para 1 hora no es necesario get_timer, con time() es suficiente...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

KeiDash

Quote from: Futu-block on March 27, 2018, 03:38:50 PM
ponme un ejemplo, porque me parece curioso y creo que lo voy a usar para los programas ''demo'' que se cierre y empiece de nuevo cuando leve una hora abierto :D
(que mala idea tengo, lol)

Coincido en lo que dice SplinterGU, no lo veo muy enfocado a hacer algo con el durante una hora, a no ser que de alguna manera no estés consultando continuamente la función get_timer(). Pues un ejemplo sería algo así:


        ftime = atof("60.000"); //Una hora
toWait = get_timer() + (ftime * 1000);

Repeat
frame;
Until(get_timer() >= towait)

Futu-block

Gracias, la verdad que no tengo ni idea de como se usa get_time()

KeiDash

#38
Quote from: Futu-block on April 02, 2018, 08:34:48 PM
Gracias, la verdad que no tengo ni idea de como se usa get_time()

Pues es sencillo la verdad. La función al final lo que devuelve es el tiempo que pasa en milisegundos desde que se inició el programa. Devuelve un entero, que si lo multiplicas por 1000 (cálculo básico de tiempo) te da el tiempo en Milisegundos, por ejemplo:

Sin consutamos el tiempo en un momento concreto, supongamos que nos devuelve el valor entero 5000 (5000 / 1000 = 5 segundos)

Supongamos que pasan 3.056 segundos cuando volvemos a consultar get_timer(), la función debería devolvernos el valor entero 8056 (los 5000 de antes más los 3.056 segundos posteriores)