Souris Gamer position lag [résolu]

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Azur
Messages : 40
Inscription : ven. 22/mai/2009 23:58

Souris Gamer position lag [résolu]

Message par Azur »

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 ?
Dernière modification par Azur le ven. 03/oct./2014 11:19, modifié 1 fois.
Avatar de l’utilisateur
MetalOS
Messages : 1498
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

Re: Mousedelta

Message par MetalOS »

Chez moi aucuns problèmes
Azur
Messages : 40
Inscription : ven. 22/mai/2009 23:58

Re: Mousedelta

Message par Azur »

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 ++
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Mousedelta

Message par Ar-S »

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
Azur
Messages : 40
Inscription : ven. 22/mai/2009 23:58

Re: Mousedelta

Message par Azur »

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.





++
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Mousedelta

Message par Ar-S »

Il y a un bug avec les souris RAT. (J'ai une RAT5)
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
Azur
Messages : 40
Inscription : ven. 22/mai/2009 23:58

Re: Mousedelta

Message par Azur »

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

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
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.
Azur
Messages : 40
Inscription : ven. 22/mai/2009 23:58

Re: Mousedelta

Message par Azur »

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()

Avatar de l’utilisateur
Atlante
Messages : 337
Inscription : mer. 29/juin/2011 18:35
Localisation : Paris

Re: Souris Gamer position lag [résolu]

Message par Atlante »

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
Modérateur
Config : Intel I5 4670K, Nvidia Geforce GTX 1060, 16go RAM, SSD 256go, DD 2000go
Répondre