Screen und Gamer-Maus
- dllfreak2001
- Beiträge: 2925
- Registriert: 07.09.2004 23:44
- Wohnort: Bayern
Screen und Gamer-Maus
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.
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
Re: Screen und Gamer-Maus
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.
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
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
- dllfreak2001
- Beiträge: 2925
- Registriert: 07.09.2004 23:44
- Wohnort: Bayern
Re: Screen und Gamer-Maus
Es ist ein allgemeines Problem.
Es gibt auch Mäuse die von Haus aus eine hohe Pollingrate haben und keine spezielle
Treiber-Software haben.
Es gibt auch Mäuse die von Haus aus eine hohe Pollingrate haben und keine spezielle
Treiber-Software haben.
I´a dllfreak2001
Re: Screen und Gamer-Maus
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.
PB v5.00 B3
Maus testen ob du die Aussetzer auch bei folgendem Code hast.
Threadsafe nicht vergessen! Und ohne Debugger starten.

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
Re: Screen und Gamer-Maus
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
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.
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
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
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
- dllfreak2001
- Beiträge: 2925
- Registriert: 07.09.2004 23:44
- Wohnort: Bayern
Re: Screen und Gamer-Maus
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.
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
Re: Screen und Gamer-Maus
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.
... 1 ms ist schon mehr als übertrieben, aber noch
schneller braucht so wie so niemand. Von daher sollte
das kein Problem sein.
MFG PMV

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.

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

MFG PMV
- dllfreak2001
- Beiträge: 2925
- Registriert: 07.09.2004 23:44
- Wohnort: Bayern
Re: Screen und Gamer-Maus
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.
tatsächlich da sind kann ich allerdings nicht beurteilen.
I´a dllfreak2001
Re: Screen und Gamer-Maus
Hi dllfreak2001, über dieses Thema hatten wir uns bereits vor etwas längerer Zeit ausgetauscht.
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.)
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.
http://forums.purebasic.com/english/vie ... hp?p=88360

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

http://forums.purebasic.com/english/vie ... hp?p=88360
PB 4.00 | Windows XP Home SP3