Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Eventos del raton demorados

Iniciado por Pogacha, 07 de Marzo de 2008, 01:59:29 PM

« anterior - próximo »

Pogacha

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

tamat

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.
Por un stratos menos tenso

Zaelsius

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í).

Pogacha

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.

fjfnaranjo

Quizá te interese consultarlo en alguna librería multiplataforma, como SDL, para ver como lo hacen ellos...
fjfnaranjo.com - Creating entertainment - Creando entretenimiento
fjfnaranjo [4t] gm4il [d0t] c0m (mail y msn)

Pogacha

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?

tamat

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).
Por un stratos menos tenso

Pogacha

Yo tampoco, pero en una de las maquinas donde probe mi motor eso pasa ...
y es realmente problematico.

[EX3]

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...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

Pogacha

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

fjfnaranjo

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
fjfnaranjo.com - Creating entertainment - Creando entretenimiento
fjfnaranjo [4t] gm4il [d0t] c0m (mail y msn)

Pogacha

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.

Vicente

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

Pogacha


Loover

Yo uso GetCursor() a través de SDL y sin problemas de momento. No te obsesiones, ponle un sleep(0) y a correr.
IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.