Bon ok finalement on y arrive.
Déjà merci à Ar-s pour son aide.
D'après ce que je comprend, certaines souris gamer ont un taux de transfert élevé de la position.
C'est surtout visible quand la souris bouge rapidement.
Si on essaye de récupérer la position de la souris dans une appli synchronisée par le rafraichissement écran, 60Hz chez moi, il manque des infos, ça lag.
Si on désactive la synchro écran avec le paramètre #PB_Screen_NoSynchronization c'est beaucoup plus lisse.
Mais ça ne vaut que pour des petits programmes de test, sur un gros programme on pourra de nouveau se retrouver à 20 frames pas secondes si il y a beaucoup de calculs sur une bécane peu puissante par exemple.
L'idée du thread suggérée par Ar-s permet de récupérer la position à une fréquence proche de 1000Hz ( je pense pas me tromper ? ) puisque le thread boucle avec un delay(1)
Par contre si on se contente de récupérer le déplacement de la souris dans le thread et qu'on le passe tel quel au programme principal ce ne sera pas bon, dans le cas de déplacements lents le thread passera une majorité de déplacements = 0
Si vous bougez la souris de 5 pixels en 1 seconde, à 1000Hz vous aurez 995 déplacements nuls
Comme le programme principal ne tourne pas à 1000Hz mais à 60Hz par exemple, il ira piocher des déplacements au pif, et, a de grandes chances de ne voir que des 0.
Donc l'idée c'est d'additionner les déplacements dans le thread jusqu'à ce que le programme principal demande le résultat au thread.
Voici un code de test avec une boucle principale qui boucle en 50ms et qui interroge le thread sur la somme des déplacements enregistrés depuis la requête précédente.
Une barre rouge s'affiche proportionnelle au déplacement de la souris vers la droite.
On voit que ça prend même pour des mouvement lents.
J'ai commenté en quelque choses qui ressemble à de l'anglais pour le forum rosbif où j'ai aussi ouvert une discussion.
++
Code : Tout sélectionner
EnableExplicit
InitSprite()
InitKeyboard()
InitMouse()
Structure appli
flag_request_mouse_delta.i ; set this to 1 to request the deltas
mouseDeltaX.i ; deltas are recovered here
mouseDeltaY.i
thread.l ; index for killThread()
EndStructure
Global appli.appli
OpenWindow(0,0,0,800,600,"",#PB_Window_ScreenCentered) ;i have no idea what i'm doing
OpenWindowedScreen(WindowID(0),0,0,800,600)
Procedure sortie()
KillThread(appli\thread)
End
EndProcedure
;******************
Procedure scan() ; press esc to QUIT
Define ev=WaitWindowEvent(1) ;******************
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Escape)
sortie()
EndIf
EndProcedure
Procedure render()
appli\flag_request_mouse_delta=1 ; set flag to 1 -> request deltas
While appli\flag_request_mouse_delta=1 ; wait for flag=0
Delay(1)
Wend
ClearScreen(RGB(0,0,0)) ; deltas are fetched by the thread
StartDrawing(ScreenOutput())
Box(0,0,appli\mouseDeltaX,300,RGB(255,0,0))
StopDrawing()
FlipBuffers()
EndProcedure
Procedure mouseScan(var.i) ; this thread records the mouse position
Static xincrement.i
Static yincrement.i
Repeat
If appli\flag_request_mouse_delta=0 ; increment deltas until they are requested
ExamineMouse()
xincrement+MouseDeltaX()
yincrement+MouseDeltaY()
Delay(1)
Else
appli\mouseDeltaX=xincrement ; request flag = 1 -> fetch deltas
appli\mouseDeltaY=yincrement
xincrement=0
yincrement=0
appli\flag_request_mouse_delta=0 ; set request flag = 0
Delay(1)
EndIf
ForEver
EndProcedure
Procedure main()
Repeat
scan() ; scan ui
render() ; draws
Delay(50) ; simulate a laggy app
ForEver
EndProcedure
appli\thread=CreateThread(@mouseScan(),#True)
main()