Screen und Gamer-Maus

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
dllfreak2001
Beiträge: 2925
Registriert: 07.09.2004 23:44
Wohnort: Bayern

Screen und Gamer-Maus

Beitrag von dllfreak2001 »

Kurz zum Problem:
Die Mausbefehle von PB für den Screen setzen ständig aus wenn die Maus eine hohe Pollingrate besitzt.
Dies trifft häufig auf Gamer-Mäuse zu. Stelle ich die Rate bei meiner Maus auf 120 Hz herunter werden
Mausabfragen sauber durchgeführtund der Cursor hackt auch nicht. Je höher die Pollingrate ist, desto
schlimmer werden die Aussetzer.


Das Problem ist ja nun schon länger bekannt, wurde aber noch nicht gefixt. Deshalb bin ich jetzt auf der
Suche nach einer Alternative, die dieses Problem nicht hat. Bevor ich weitermache wollte ich mal fragen ob
es da schon etwas gibt.
I´a dllfreak2001
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Screen und Gamer-Maus

Beitrag von STARGÅTE »

Bist du dir denn sicher, dass die installierten Treiber für die Maus auch im PB-Screen laufen?
Zumindest ich musste das bei mir immer erst einstellen (Spielerkennung), ansonsten hab ich im Screen nur die Funktionen und Einstellungen von Windows ...
Hab mich nämlich damals auch gewundert, warum keine Mausbeschleunigung in PB aktiv war.
Aber sowas stellt man ja nun mal für jedes Spiel extra ein, bei Ego-Shootern hab ich die zB aus, bei Strategie ein.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
dllfreak2001
Beiträge: 2925
Registriert: 07.09.2004 23:44
Wohnort: Bayern

Re: Screen und Gamer-Maus

Beitrag von dllfreak2001 »

Es ist ein allgemeines Problem.
Es gibt auch Mäuse die von Haus aus eine hohe Pollingrate haben und keine spezielle
Treiber-Software haben.
I´a dllfreak2001
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Re: Screen und Gamer-Maus

Beitrag von PMV »

Du hast hoffentlich Windows? Könntest du mal bitte mit deiner
Maus testen ob du die Aussetzer auch bei folgendem Code hast.
Threadsafe nicht vergessen! Und ohne Debugger starten. :wink:
PB v5.00 B3

Code: Alles auswählen

;
; ------------------------------------------------------------
;
;   PureBasic - MousePick
;
;    (c) 2011 - Fantaisie Software
;
; ------------------------------------------------------------
;

Structure MouseData
  X.i
  Y.i
  DeltaX.i
  DeltaY.i
  Button.i[3]
  LeftButton.i
  LeftClickCounter.i
  LeftDoubleClick.i
  LeftDClickCounter.i
  LeftLastPush.i
EndStructure
Global MouseData.MouseData

Global InputTime.d
Global Quit.i

;MouseButton
Enumeration
  #MouseButton_None
  #MouseButton_Down
  #MouseButton_Released
  #MouseButton_FirstPush
EndEnumeration


Macro UpdateMouseButton(MButton)
  If MouseData\Button[#PB_MouseButton_#MButton-1]
    Select MouseData\MButton#Button
      Case #MouseButton_None, #MouseButton_Released
        If MouseData\MButton#LastPush + 200 >= InputTime And (Not MouseData\MButton#DoubleClick)
          MouseData\MButton#DoubleClick = #True
        Else 
          MouseData\MButton#LastPush = InputTime
        EndIf  
        MouseData\MButton#Button = #MouseButton_FirstPush
      Case #MouseButton_FirstPush
        MouseData\MButton#Button = #MouseButton_Down
    
    EndSelect
  Else
    Select MouseData\MButton#Button
      Case #MouseButton_FirstPush, #MouseButton_Down
        MouseData\MButton#Button = #MouseButton_Released
        MouseData\MButton#DoubleClick = #False
        
      Case #MouseButton_Released
        MouseData\MButton#Button = #MouseButton_None
    EndSelect
  EndIf
EndMacro

Procedure InputThread(Dummy.i)
  Static Frequenz.q, Timer.q,PrevTimer.q
  
  ; initialize timing
  If Not QueryPerformanceFrequency_(@Frequenz) 
    Frequenz = 0
  EndIf
  ; ----  
  
  Repeat
    ;timing
    QueryPerformanceCounter_(@Timer)
    InputTime = 1000 * Timer / Frequenz
    PrevTimer = Timer
        
    ; mouse input
    ExamineMouse()
    With MouseData
      \X = MouseX()
      \Y = MouseY()
      
      \DeltaX + MouseDeltaX()
      \DeltaY + MouseDeltaY()
      
      \Button[#PB_MouseButton_Left-1] = MouseButton(#PB_MouseButton_Left)
      \Button[#PB_MouseButton_Right-1] = MouseButton(#PB_MouseButton_Right)
      \Button[#PB_MouseButton_Middle-1] = MouseButton(#PB_MouseButton_Middle)
    EndWith
    UpdateMouseButton(Left)
    ;UpdateMouseButton(Middle)
    ;UpdateMouseButton(Right)    
    
    ; start picking an object
    If MouseData\LeftButton = #MouseButton_FirstPush
      MouseData\LeftClickCounter + 1
      If MouseData\LeftDoubleClick
        MouseData\LeftDClickCounter + 1
      EndIf
    EndIf
    Delay(1)
  Until Quit = 1
EndProcedure


#CameraSpeed = 0.4

Enumeration
  #MainWindow 
  #Editor
EndEnumeration

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY

If InitEngine3D()
  
  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Models", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Scripts", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/GUI", #PB_3DArchive_FileSystem)
  Parse3DScripts()
  
  InitSprite()
  InitKeyboard()
  InitMouse()
  
  If Screen3DRequester()
    
    ; First create materials
    ;
    GetScriptMaterial(0, "Color/Blue")
    GetScriptMaterial(1, "Color/Green")
    GetScriptMaterial(2, "Color/Red")
    GetScriptMaterial(3, "Color/Yellow")
    CreateMaterial(4, LoadTexture(0, "Dirt.jpg"))
    
    ; Meshes
    ;
    CreateCube(0, 2)
    CreateSphere(1, 1)
    CreateCylinder(2, 1, 4)
    CreatePlane(3, 20, 20, 1, 1, 1, 1)

    ; Entities
    ;
    CreateEntity(0, MeshID(0), MaterialID(0),  4, 1, 0)
    CreateEntity(1, MeshID(1), MaterialID(1), -4, 1, 0)
    CreateEntity(2, MeshID(2), MaterialID(2),  0, 2, 0)
    CreateEntity(4, MeshID(3), MaterialID(4))
    
    CreateEntity(3, MeshID(1), MaterialID(3))  
    ScaleEntity(3, 0.1, 0.1, 0.1)
    
    ; Camera
    ;
    CreateCamera(0, 0, 0, 100, 100)
    CameraLocate(0, -1, 8, 15)
    CameraLookAt(0, -1, 0, 0)
    
    ; Light
    ;
    CreateLight(0, $FFFFFF, 1560, 900, 500)
    AmbientColor($330000)
    
    ;GUI
    ;
    OpenWindow3D(#MainWindow, 10, 10, 340, 75, "MousePick")
    StringGadget3D(#Editor, 20, 10, 300, 30, "Clic somewhere", #PB_String3D_ReadOnly)
        
    ShowGUI(128, 1) ; Display the GUI, semi-transparent and display the mouse cursor
    timeBeginPeriod_(1)
    InputThread = CreateThread(@InputThread(), 0)
    Repeat
      Screen3DEvents()
      
      Repeat
        Event3D = WindowEvent3D()
      Until Event3D = 0
      
      
    
      InputEvent3D(MouseData\X, MouseData\Y, MouseData\Button[#PB_MouseButton_Left-1])
 
      If MouseData\LeftClickCounter
        Entity = MousePick(0, MouseData\X, MouseData\Y)
        If Entity>=0 And Entity<>3
          EntityLocate(3, PickX(), PickY(), PickZ())
          SetGadgetText3D(#Editor, "Entity = " + Str(Entity))
        EndIf
        MouseData\LeftClickCounter - 1
      EndIf

      
      If ExamineKeyboard()
        
        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed 
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed 
        Else
          KeyX = 0
        EndIf
        
        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed 
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed 
        Else
          KeyY = 0
        EndIf
        
      EndIf
               
      CameraLookAt(0, 0, 0, 0)
      MoveCamera  (0, KeyX, 0, KeyY)
      
      RenderWorld()
      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
    Quit = 1
    WaitThread(InputThread)
    timeEndPeriod_(1)

  EndIf
  
Else
  MessageRequester("Error", "The 3D Engine can't be initialized", 0)
EndIf

End
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Screen und Gamer-Maus

Beitrag von STARGÅTE »

Ja lol, wenn es das ist was ich vermute und du ExamineMouse() nur mit der Frame-Raten-Frequenz aufrufst, ist es natürlich klar, das ein Click, der "kürzer" ist als ein Frame, nicht registriert wird.

ExamineMouse() arbeitet nicht so wie WindowEvent() wo die Events ggf. noch in einem Puffer gelagert werden, wenn sie nicht abgerufen werden.

Wenn ich 5 FPS einstelle und

Code: Alles auswählen

ExamineMouse()
If MouseButton(1)
  Debug 1
EndIf
in der Frame-Schleife hab, bekomm ich auch keine 1 debuggt, wenn ich ungünstig klicke.

Da ist das vorgehen von PMV schon richtiger, sodass die Events selbst registriert werden.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
dllfreak2001
Beiträge: 2925
Registriert: 07.09.2004 23:44
Wohnort: Bayern

Re: Screen und Gamer-Maus

Beitrag von dllfreak2001 »

Ja, PMVs Code funktioniert. An einen eigenen Thread dafür habe ich auch schon gedacht, nur dann dachte ich mir
so billig kann die Lösung ja garnicht sein. PMVs Code reagiert auch nicht auf Events sondern pollt einfach nur schneller, da
der nicht auf den Refresh des Screens warten muss.

Eine Schwachstelle die mit noch schnelleren Mäusen durchaus zu Problemen führen kann.
I´a dllfreak2001
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Re: Screen und Gamer-Maus

Beitrag von PMV »

Sehr gut. :)

1000Hz Mäuse? Scheint der aktuelle High-End-Standard
zu sein, was schnelleres hab ich jetzt nicht finden können.
Man kann aber natürlich das Delay(1) auch weg lassen
und nen ganzen Core nur für die Maus belasten. Aber
stimmt, irgend wie muss man die 8 CPU-Threads ja auch
ausnutzen können, die so mancher zur Verfügung hat.
:mrgreen:

... 1 ms ist schon mehr als übertrieben, aber noch
schneller braucht so wie so niemand. Von daher sollte
das kein Problem sein. :wink:

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
dllfreak2001
Beiträge: 2925
Registriert: 07.09.2004 23:44
Wohnort: Bayern

Re: Screen und Gamer-Maus

Beitrag von dllfreak2001 »

Es hat schon was. Den unterschied zu 120 Hz merkt man schon deutlich, ob die Vorteile dadurch nur eingebildet oder
tatsächlich da sind kann ich allerdings nicht beurteilen.
I´a dllfreak2001
Rebon
Beiträge: 263
Registriert: 20.05.2009 19:13

Re: Screen und Gamer-Maus

Beitrag von Rebon »

Hi dllfreak2001, über dieses Thema hatten wir uns bereits vor etwas längerer Zeit ausgetauscht. :wink:

ClearScreen() bremste zumindest damals das Ganze in PB 4.51.
Hier ein Link zu meinem damaligen Beitrag:
http://forums.purebasic.com/german/view ... a3eb0ffb87
Und hier der Code:
(Ich habe es nicht getestet, aber wahrscheinlich ist dann auch ein eigener Thread für die Mausabfrage nicht mehr unbedingt nötig, wenn DirectX7 als Subsystem im Compiler eingestellt ist.)

Code: Alles auswählen

EnableExplicit

InitKeyboard()
InitMouse()
InitSprite()
InitSprite3D()

#Width = 1280
#Height = 1024
#Depth = 32
#Hz = 60

If OpenScreen(#Width, #Height, #Depth,"MouseThread", #PB_Screen_WaitSynchronization, #Hz) = #False
  End
EndIf

Define.i

Structure MousePos
  *xPos.Integer
  *yPos.Integer
EndStructure

Global x = 1, y = 1, *Position.MousePos = AllocateMemory(SizeOf(MousePos)), *Position\xPos = @x, *Position\yPos = @y, Spritenr, quit = #False, Color = 100

For Spritenr = 0 To 30
  CreateSprite(Spritenr, 128, 128, #PB_Sprite_Texture)
 
  StartDrawing(SpriteOutput(Spritenr))
    Box(0, 0, 128, 128, RGB(Color-70,Color-50,Color-10))
  StopDrawing()
 
  CreateSprite3D(Spritenr, Spritenr)
  Color + 1   
Next Spritenr

Sprite3DQuality(1)

Procedure mousethread(flag.i)
   If flag
      Repeat
        ExamineKeyboard()
        If KeyboardPushed(#PB_Key_Escape)
             quit = #True
           Break
        EndIf
        Delay(1)
        ExamineMouse()
        *Position\xPos\i = MouseX()
        *Position\yPos\i = MouseY()
      Until quit
   EndIf
EndProcedure

CreateThread(@mousethread(),#True)

Repeat
  StartSpecialFX()
    ClearScreen(0)
  StopSpecialFX()

  Start3D()
    Delay(1)
    DisplaySprite3D(0, x, y, 155)
    DisplaySprite3D(1, x-1, y+1, 155)
    DisplaySprite3D(2, x-2, y+2, 155)
    DisplaySprite3D(3, x-3, y+3, 155)
    DisplaySprite3D(4, x-4, y+4, 155)
    DisplaySprite3D(5, x-5, y+5, 155)
    DisplaySprite3D(6, x-6, y+6, 155)
    DisplaySprite3D(7, x-7, y+7, 155)
    DisplaySprite3D(8, x-8, y+8, 155)
    DisplaySprite3D(9, x-9, y+9, 155)
    DisplaySprite3D(10, x-10, y+10, 155)
    DisplaySprite3D(11, x-11, y+11, 155)
    DisplaySprite3D(12, x-12, y+12, 155)
    DisplaySprite3D(13, x-13, y+13, 155)
    DisplaySprite3D(14, x-14, y+14, 155)
    DisplaySprite3D(15, x-15, y+15, 155)
    DisplaySprite3D(16, x-16, y+16, 155)
    DisplaySprite3D(17, x-17, y+17, 155)
    DisplaySprite3D(18, x-18, y+18, 155)
    DisplaySprite3D(19, x-19, y+19, 155)
    DisplaySprite3D(20, x-20, y+20, 155)
    DisplaySprite3D(21, x-21, y+21, 155)
    DisplaySprite3D(22, x-22, y+22, 155)
    DisplaySprite3D(23, x-23, y+23, 155)
    DisplaySprite3D(24, x-24, y+24, 155)
    DisplaySprite3D(25, x-25, y+25, 155)
    DisplaySprite3D(26, x-26, y+26, 155)
    DisplaySprite3D(27, x-27, y+27, 155)
    DisplaySprite3D(28, x-28, y+28, 155)
    DisplaySprite3D(29, x-29, y+29, 155)
    DisplaySprite3D(30, x-30, y+30, 155)
    Stop3D()
    FlipBuffers()
Until quit

CloseScreen()
End
Eigentlich wollte ich dieses noch mit dem Code von S.M. für Triple Buffering zusammen mit der Mausabfrage testen, allerdings waren dann meine Kenntnisse doch zu bescheiden. :lamer:
http://forums.purebasic.com/english/vie ... hp?p=88360
PB 4.00 | Windows XP Home SP3
Antworten