Souris Gamer position lag [résolu]
Souris Gamer position lag [résolu]
Salut, j'ai un petit soucis avec les exemples 3d de PB.
Quand la souris est utilisée pour tourner la camera, si je bouge la souris lentement ça va mais si je bouge la souris rapidement la camera reste figée.
J'ai fais deux trois test et il apparait que quand ma souris bouge trop vite mon mousedeltax bloque.
Est ce que ça fait la même chose chez vous ?
Quand la souris est utilisée pour tourner la camera, si je bouge la souris lentement ça va mais si je bouge la souris rapidement la camera reste figée.
J'ai fais deux trois test et il apparait que quand ma souris bouge trop vite mon mousedeltax bloque.
Est ce que ça fait la même chose chez vous ?
Dernière modification par Azur le ven. 03/oct./2014 11:19, modifié 1 fois.
Re: Mousedelta
Chez moi aucuns problèmes
Re: Mousedelta
Ah ok, merci d'avoir pris le temps de me répondre, je testerai ça sur une autre bécane demain.
Je sais pas pourquoi, si j'essaye de faire comme dans un shooter, me retourner super vite ça bloque.
J'ai fais un petit prog de test en 2d, une barre qui s'allonge proportionnellement à mousedeltaX, idem.
J'ai aussi la fonction ExamineMouse qui renvoie 0 - 1 - 0 - 1 sans arrêt même si la souris est statique.
Bref, merci à toi ++
Je sais pas pourquoi, si j'essaye de faire comme dans un shooter, me retourner super vite ça bloque.
J'ai fais un petit prog de test en 2d, une barre qui s'allonge proportionnellement à mousedeltaX, idem.
J'ai aussi la fonction ExamineMouse qui renvoie 0 - 1 - 0 - 1 sans arrêt même si la souris est statique.
Bref, merci à toi ++
Re: Mousedelta
As-tu une souris classique ?
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Re: Mousedelta
Hello.
Bon j'ai fais une réinstall de Win et toujours pareil.
Quand je bouge la souris rapidement mon mouseDelta part en live.
Je suis avec une madCat RAT7.
J'ai testé avec une autre souris gamer et ça marche nikel.
++
Bon j'ai fais une réinstall de Win et toujours pareil.
Quand je bouge la souris rapidement mon mouseDelta part en live.
Je suis avec une madCat RAT7.
J'ai testé avec une autre souris gamer et ça marche nikel.
++
Re: Mousedelta
Il y a un bug avec les souris RAT. (J'ai une RAT5)
Essaye ça :
Essaye ça :
Code : Tout sélectionner
;en debut de code
Declare mousethread(flag.i)
; dans tes procedures
Procedure mousethread(flag.i) ; souris roccat, razer .....
Static quit.i
If flag
Repeat
If ExamineMouse()
Mx=MouseX()
My=MouseY()
EndIf
Delay(1)
Until quit
quit=#False
Else
If Not flag
quit=#True
While quit
Delay(1)
Wend
EndIf
EndIf
EndProcedure
;Tu lances la procedure en thread lorsque tu ouvres ta fenêtre graphique
CreateThread(@mousethread(),#True)
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Re: Mousedelta
Salut Ar-S.
Oui en effet avec ton code les mouvements rapides sont bien pris en compte et je ne suis pas certain de comprendre pourquoi.
Le thread tourne à 1000Hz +- c'est pour ça ?
J'ai pris ton code pour un exemple dans lequel le mouvement vers la droite de la souris dessine une barre rouge proportionnelle.
Le deltaX mesuré est multiplié par 10 pour être plus visible
Deux trucs :
Ici les mouvements lents ne sont pas pris en compte, si j'essaye de bouger de 1 pixel ou 2 ça ne prend pas :/
Je ne sais pas pourquoi mais la souris ne peut plus sortir de l'écran, plus accès au gadget closeWindow.
Oui en effet avec ton code les mouvements rapides sont bien pris en compte et je ne suis pas certain de comprendre pourquoi.
Le thread tourne à 1000Hz +- c'est pour ça ?
J'ai pris ton code pour un exemple dans lequel le mouvement vers la droite de la souris dessine une barre rouge proportionnelle.
Le deltaX mesuré est multiplié par 10 pour être plus visible
Code : Tout sélectionner
InitMouse()
InitSprite()
Structure appli
mouseDeltaX.l
mouseDeltaY.l
EndStructure
Global appli.appli
; dans tes procedures
Procedure mousethread(flag.i) ; souris roccat, razer .....
Static quit.i
If flag
Repeat
If ExamineMouse()
appli\mouseDeltaX=MouseDeltaX()
appli\mouseDeltaY=MouseDeltaY()
EndIf
Delay(1)
Until quit
quit=#False
Else
If Not flag
quit=#True
While quit
Delay(1)
Wend
EndIf
EndIf
EndProcedure
;Tu lances la procedure en thread lorsque tu ouvres ta fenêtre graphique
OpenWindow(0,0,0,640,480,"",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
OpenWindowedScreen(WindowID(0),0,0,640,480)
CreateThread(@mousethread(),#True)
Repeat
ClearScreen(RGB(0,0,0))
StartDrawing(ScreenOutput())
Box(0,0,appli\mouseDeltaX*10,480,RGB(255,0,0))
StopDrawing()
FlipBuffers()
Until WaitWindowEvent(10)=#PB_Event_CloseWindow
Ici les mouvements lents ne sont pas pris en compte, si j'essaye de bouger de 1 pixel ou 2 ça ne prend pas :/
Je ne sais pas pourquoi mais la souris ne peut plus sortir de l'écran, plus accès au gadget closeWindow.
Re: Mousedelta
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.
++
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()
Re: Souris Gamer position lag [résolu]
Hello,
C'est un sujet que j'ai déjà abordé :
http://www.purebasic.fr/french/viewtopi ... ilit=mouse
tu trouveras dans les post un lien vers le forum anglais.
cdt,
Atlante
C'est un sujet que j'ai déjà abordé :
http://www.purebasic.fr/french/viewtopi ... ilit=mouse
tu trouveras dans les post un lien vers le forum anglais.
cdt,
Atlante
Modérateur
Config : Intel I5 4670K, Nvidia Geforce GTX 1060, 16go RAM, SSD 256go, DD 2000go
Config : Intel I5 4670K, Nvidia Geforce GTX 1060, 16go RAM, SSD 256go, DD 2000go