Supongo todos habran visto este problema alguna ves.
En algunos juegos en algunas computadoras, tu mueves el raton y un segundo despues este reacciona.
A que se debe esto?
Como se puede hacer para que esto no pase?
Supongo que algo tendrá que ver la saturacion del CPU ... pero no estoy seguro ...
Si alguien sabe algo se agradece!
Saludos
En el tema del input hay dos maneras de pillarlo, por mensaje o por encuesta.
Por mensaje es que esperas a que el API (SO, o lo que sea) te envie un mensaje informandote que el raton se ha movido. Esto suele ser horrible para juegos ya que si la CPU va al tope entonces los mensajes llegan cuando le da la gana.
Por encuesta es que tu le preguntas directamente al periferico el estado de cierta tecla/cursor. Esto es inmediato (aunque supongo que tiene un ligero overhead) y normalmente se hace durante la fase de update de la aplicación, así garantizas que no haya latencia.
En castellano, que hagas polling del ratón xD . Ahora mismo no sé si en Windows se puede hacer sin pasar por DirectInput (supongo que sí).
Gracias por las respuestas,
La idea es no usar DInput, para poder asi coordinar el puntero del juego con el puntero del mouse.
Tanto el WM_MOVE, como GetCursorPos me devuelven valores tardios ...
Puedo probar a hacer un Sleep(0); una vez por frame ... pero como no es en mi computadora que pasa no puedo saber los resultados hasta dentro de un tiempo.
Quizá te interese consultarlo en alguna librería multiplataforma, como SDL, para ver como lo hacen ellos...
SDL usa GetCursorPos ...
Hasta ahora tengo para probar tan solo hacer un Sleep(0) en cada frame cosa de dar mas tiempo al sistema.
Tambien a los mensajes de windows los atiendo con un
while(PeekMessageA(&msg,hWnd,0,0,PM_REMOVE))
{
// if(AccelerationTable) TranslateAccelerator(hWnd, AccelerationTable, &msg);
TranslateMessage(&msg);
DispatchMessageA(&msg);
}
Se les ocurre algo mas que pueda probar?
Si SDL usa GetCursorPos entonces no me cuadra, yo en SDL nunca he tenido latencia en el raton, ni en escenas horriblemente cargadas (en GLUT que usa mensajes si).
Yo tampoco, pero en una de las maquinas donde probe mi motor eso pasa ...
y es realmente problematico.
Yo en dx_lib32 tengo igualmente implementado GetCursorPos() y jamas he tenido problemas de retardos.
Por otro lado, los problemas de retardos de cursor, seguro que es el cursor y no el render el que se demora? Recuerdo el Half-Life cuando lo configurabas para renderizar con Direct3D en vez de OpenGL y la vista iba con retardo respecto al movimiento del raton y teclado, pero esto tampoco pasaba en todas las maquinas (aunque si en la mayoria)
Salu2...
Si ahí mismo es en donde yo lo habia visto antes.
Es realmente extraño pues mis busquedas por internet hablan del famoso "mouse lag" y que lo solucionan usando GetCursorPos ! :shock:
Me parece que lo unico que voy a hacer es probar agregando este Sleep(0) y no complicarme mas pues en realidad es un problema unico y seguro que hay solución ...
Por otro lado, seguro que el problema esta en el parte de windows y no de como estoy implementando las cosas, pero eso al usuario final no le importa :P
Saludos y muchas gracias
Puede que sea un problema de la máquina en concreto, más que del programa, sobre todo si tanta gente lo ha solucionado ya con GetCursorPos (te propuse el ejemplo de SDL porque a mí siempre me ha ido muy bien).
Prueba ejecutarlo en otro equipo, o limpia el ratón :P
Gracias por el consejo, pero lamentablemente no tengo acceso a la maquina y tampoco puedo abusar de su generosidad pidiendole que haga muchas pruebas. Y sí es un problema en particular (cierta combinacion de hardware y software), pero este se repetirá varias veces, por lo tanto, queria solucionarlo.
Nosotros en Jade usamos los mensajes de Windows para el input y no hemos tenido tampoco problemas (o no hemos encontrado una máquina que nos los de).
Un saludo,
Vicente
Gracias por el aporte.
Yo uso GetCursor() a través de SDL y sin problemas de momento. No te obsesiones, ponle un sleep(0) y a correr.
Si me parece que eso voy a hacer.