¿Puede simularse con exactitud una secuencia de teclas grabadas previamente?

Iniciado por leogdsl, 4 Julio 2020, 07:01 AM

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

leogdsl

Hola,

Estoy desarrollando una aplicación para repetir las pulsaciones del teclado que fueron grabadas anteriormente. El enfoque de la aplicación son los speedrun, sería algo como un TAS (tool-assisted speedrun or tool-assisted superplay).

La aplicación detecta las teclas presionadas mediante el uso de hooks y manteniendo un registro de estas con toda la información que el hook proporciona (lo que encontramos en la estructura KBDLLHOOKSTRUCT). Las secuencia de teclas son detectadas y grabadas correctamente, así como la simulación para reproducir esta secuencia, sin embargo, el problema que estoy teniendo es relacionado a la precisión.

Si por ejemplo, juego Super Mario Bros de Nintendo y grabo todas las pulsaciones del teclado y luego lo reproduzco, puedo ver pequeñas diferencias, salta un poco antes o un poco después, etc. Y si lo pruebo varias veces puedo obtener resultados ligeramente diferentes.

Para calcular cuanto tiempo debe estar presionada una tecla y cuando debe ser liberada he usado la variable time de la estructura KBDLLHOOKSTRUCT, calculando la diferencia entre el keydown y el keyup, uso esta misma información para la simulación. En vista que los resultados no son exactos he desconfiado de este tiempo y he agregado los Ticks que se tienen en el momento del keydown y del keyup, he notado diferencias de varios mili-segundos comparándolos con el time de la estructura que mencioné antes, sin embargo, la simulación usando estos Ticks sigue siendo inexacta.

En cuanto a como hago para esperar el tiempo que se debe para pulsar o liberar una tecla he usado varios métodos, Thread.Sleep, o un ciclo comparando los Ticks e iterando internamente con Thread.SpinWait o Thread.Sleep cada 1ms, stopwath, etc. Después de cada espera verifico las diferencias de tiempos y por lo general no supera 1 ms.

Todo esto me hace pensar si hay algo que debo considerar para lograr conseguir lo que quiero.

¿Será que el tiempo que recibo de los eventos no es exacto? y por tal razón no logro reproducirlo de forma exacta. Será que debo tener en cuenta la resolución de la CPU para hacer más exacta la espera o simplemente debería cambiar el enfoque.

Cualquier ayuda es bien recibida, gracias de ante mano.

AlbertoBSD

Es un problema físico. Como el del electrón que no puedes medir su velocidad sin modificar su dirección, es algo similar.

Utilizas el mismo sistema operativo para medir los tiempos sin considerar que este a su vez ya gasto algo de tiempo recibiendo esa información por parte del hardware

Además si consideras todas las operaciones que el SO realiza entre un programa y otro (lecturas de disco, pasar de un programa a otro, y realizar funciones propias del sistema, almacenamiento de memoria, etc)

Lo único que se me ocurre es que realices alguna grabación a nivel hardware, con algún equipo externo.

Tambien podrías tratar de promediar la diferencia de tiempos entre lo originalmente enviado y lo que logras reproducir y le restes ese promedio de diferencia a las peticiones enviadas

Saludos
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

FFernandez

Si registras el Key...  consulta la hora de sistema............obtendras un retardo   el mismo que la nueva consulta del Key....   la diferencia deberia de aproximarse muchisimo al tiempo que estubo presionada.

No hagas calculos mientras registra. Reducira las diferencias.