Autor Tema: Timers Inexactos (mover objeto)  (Leído 5965 veces)

0 Usuarios y 1 Visitante están viendo este tema.

seba123neo

  • Terabyte
  • *****
  • Mensajes: 763
  • Reputación: +88/-5
    • Ver Perfil
Timers Inexactos (mover objeto)
« en: Octubre 14, 2013, 09:18:09 pm »
Hola, saludos a todos, hace mucho no pregunto algo y me gustaria saber que solucion se le puede dar a este tema, lo voy a explicar lo mejor que pueda.

Como aficionado a la astronomia, siempre me gusto hacer mini progamas pedorros, que en realidad nunca publique, relacionados con calculos de fisica, en este caso estaba haciendo para pasar el rato, un simulador (si se lo puede llamar asi) de gravedad de los planetas, no se asusten, es simplemente mostrar la diferencia que hay de gravedad en atraer un objeto en las diferentes gravedades de los planetas y el sol (la cual es gigante).

lo unico que hago es mover un objeto hacia abajo en el formulario con el metodo .Move

aca les paso una captura para que vean:



1 - El usuario coloca la altura de la cual va a caer el objeto en metros
2 - Mediante una formula de fisica calculo cuanto tarda ese objeto en caer al piso.
3 - Muevo la pelota hacia abajo hasta llegar al piso (la linea celeste), el tiempo que tarda en llegar es lo que calcule anteriormente.

Para dar un ejemplo simple, supongamos que el objeto tarda 10 segundos en caer, lo unico que tengo que hacer es mover la pelota para que llegue en 10 segundos al piso, asi de simple.

el recorrido siempre es fijo (7620 Twips), o sea desde la base de la pelota hasta la linea hay 7620.

- El Timer se ejecuta cada 10 milisegundos, y como tarda en total 10 segundos o sea 10000 milisegundos, entonces se va a tener que ejeuctar unas 1000 veces.

- Haciendo 7620 / 1000 me da 7.62, o sea en cada iteracion del timer me tiene que mover el objeto unos 7.62, para que a los 10 segundos llegue a 7620.

- Ese timer me mueve el objeto 7.62 Twips en cada iteracion del Timer, o sea que en total se ejecuta unas 1000 veces el timer.

hasta ahi todo bien, el tema es que no tarda 10 segundos ni en pedo, tarda mucho mas.

Yo se que el Timer es totalmente inexacto para trabajar con milisegundos, entonces probe con una clase de Cobein, la cTimer pero es igual o peor, hay una diferencia tremenda.

¿ Como puedo hacer esto de forma exacta ?

saludos.

79137913

  • Megabyte
  • ***
  • Mensajes: 185
  • Reputación: +21/-4
  • 4 Esquinas
    • Ver Perfil
    • Eco.Resumen Resumenes Cs. Economicas
Re:Timers Inexactos (mover objeto)
« Respuesta #1 en: Octubre 15, 2013, 08:26:21 am »
HOLA!!!

Se que no te va a gustar mi respuesta, pero teniendo en cuenta que no te anduvo nada tomaria el camino por este lado...

Código: [Seleccionar]
do until pelota.top >= 7620
actual= timer
pelota.top = pelota.top + 7.62 * (actual - anterior)
anterior = timer
doevents
loop
pelota.top = 7620

GRACIAS POR LEER!!!
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

 79137913                          *Shadow Scouts Team*                                                          Resumenes Cs.Economicas

cobein

  • Moderador Global
  • Gigabyte
  • *****
  • Mensajes: 348
  • Reputación: +63/-0
  • Más Argentino que el morcipan
    • Ver Perfil
Re:Timers Inexactos (mover objeto)
« Respuesta #2 en: Octubre 15, 2013, 09:23:10 am »
Seba, ahi tenes varias cosas que seguro influyen, el timer tiene una resolucion de ms, el problema es que desde el trigger del timer hasta que tu code se ejecuta hay una diferencia y teniendo en cuenta que estas ejecutando cada 10 ms esto seguramente se hace evidente.
Yo optaria por primero usar pixeles, eso te va a dar por ejemplo en tu caso 508 iteraciones y no va a afectar el efecto visual, otra cosa que haria es tomar el tiempo inicial (preferentemente usando QueryPerformanceCounter) y reclacularia cada por ejemplo 10 iteraciones el tiempo restante y la velocidad para corregir la diferencia por el tiempo de ejecucion.
 

Waldo

  • Gigabyte
  • ****
  • Mensajes: 264
  • Reputación: +22/-0
    • Ver Perfil
Re:Timers Inexactos (mover objeto)
« Respuesta #3 en: Octubre 15, 2013, 10:32:32 am »
Hola no conozco la clase de Cobein,
Pero probaste usando la api  timeSetEvent:

Public Declare Function timeSetEvent Lib "winmm.dll" (ByVal uDelay As Long, ByVal uResolution As Long, ByVal lpFunction As Long, ByVal dwUser As Long, ByVal uFlags As Long) As Long


seba123neo

  • Terabyte
  • *****
  • Mensajes: 763
  • Reputación: +88/-5
    • Ver Perfil
Re:Timers Inexactos (mover objeto)
« Respuesta #4 en: Octubre 15, 2013, 11:35:15 am »
Seba, ahi tenes varias cosas que seguro influyen, el timer tiene una resolucion de ms, el problema es que desde el trigger del timer hasta que tu code se ejecuta hay una diferencia y teniendo en cuenta que estas ejecutando cada 10 ms esto seguramente se hace evidente.
Yo optaria por primero usar pixeles, eso te va a dar por ejemplo en tu caso 508 iteraciones y no va a afectar el efecto visual, otra cosa que haria es tomar el tiempo inicial (preferentemente usando QueryPerformanceCounter) y reclacularia cada por ejemplo 10 iteraciones el tiempo restante y la velocidad para corregir la diferencia por el tiempo de ejecucion.

gracias cobein, voy a probar usar pixeles a ver que pasa.

¿ puede ser que la clase cTimer solo funciona si esta compilado ? porque cuando ejecuto desde el IDE no le da pelota al Intervalo, ¿ es por el subclass ?

gracias por las respuetas, voy a hacer unas pruebas y les comentos que paso.

saludos.

cobein

  • Moderador Global
  • Gigabyte
  • *****
  • Mensajes: 348
  • Reputación: +63/-0
  • Más Argentino que el morcipan
    • Ver Perfil
Re:Timers Inexactos (mover objeto)
« Respuesta #5 en: Octubre 15, 2013, 11:47:52 am »
Seba hay una cTinyTimer que esta toda harcodeada, es basicamente un code de Paul Caon todo harcodeado, esa funciona correctamente, acabo de testearla por las dudas y y anda bien, lo que si veo es que por ejemplo con un intervalo de 10 ms y usando GetTickCount& el tiempo entre pulsaciones es de 15/16 ms, esto es porque mas alla de la frecuencia de pulsacion tenes que tener el cuenta el tiempo de ejecucion etc, todo esto en IDE es peor aun.

Teniendo en cuenta que toda la ejecucion demora 15/16 ms cuando lo esperado son 10 es eguro que esos 10 segundos se te van a hacer mucho mas, como te decia antes es mejor usar menos iteraciones asi esta diferencia es menor, la manera seria haciendo el calculo en pixeles, otra cosa es calcular el lapso de tiempo transcurrido y ajustar la velocidad para corregir la diferencia de tiempo por la ejecucion.

Es imposible conseguir que ejecute de manera precisa porque tenes muchas cosas involucradas en el medio.

Edito:
Para medir por ejemplo el desempeño de un codigo lo que se suele hacer es correr varias veces el proceso ver la diferencia de tiempo y compensarla, todo esto se hace con la menor cantidad de procesos posibles, en tu caso no va a funcionar porque esto tiene que convivir con otros procesos asi que esta tecnica no seria aplicable.

Edito2: Otra opcion que se me ocurre es correr el ciclo en un loop y usar QueryPerformanceCounter para ver cuando realizar el proximo movimiento, esto puede ser un poco mejor.. pero creoq ue si o si vas a tener que ir recalculando a medida que animas.
« última modificación: Octubre 15, 2013, 12:17:09 pm por cobein »

seba123neo

  • Terabyte
  • *****
  • Mensajes: 763
  • Reputación: +88/-5
    • Ver Perfil
Re:Timers Inexactos (mover objeto)
« Respuesta #6 en: Octubre 15, 2013, 12:09:09 pm »
si, estaba viendo esa cTinyTimer que la encontre en tu proyecto de TheBug, voy a probar esta noche cuando pueda y te aviso que paso. capas aumentando un poco tambien de 10 ms a 50 ms o 100ms, mejoraria, yo le puse 10 porque de esa forma no se nota el delay del movimiento de la pelota.

saludos.

LeandroA

  • Administrador
  • Petabyte
  • *****
  • Mensajes: 1128
  • Reputación: +151/-8
    • Ver Perfil
Re:Timers Inexactos (mover objeto)
« Respuesta #7 en: Octubre 16, 2013, 12:22:12 am »
Hola, yo en estos días pregunte algo donde tuve una cuestión un tanto similar, en mi opinión no es un problemas de timer o mejor dicho no hay que buscar la solución en ese punto. como te dijo antes cobein, es mejor calcular desde el punto inicial hasta el tiempo actual, cuanto es lo que debería haber recorrido, una regla de tres,  (trabajar en pixels pone las cosas mas en claro),  de usar un timer o un bucle, es a gusto, no necesitas crear un bucle o un timer por planeta con uno solo basta.

PD: que buenos iconos de los planetas