[Linux] Maus in Screen sehr langsam

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
Programie
Beiträge: 1280
Registriert: 06.08.2005 22:56
Computerausstattung: https://www.sysprofile.de/id160800
Wohnort: Gernsbach
Kontaktdaten:

[Linux] Maus in Screen sehr langsam

Beitrag von Programie »

Hi,

wenn ich mit ExamineMouse() in einem Windowed Screen die Maus abfrage und in der Main Loop ExamineMouse(), WindowEvent() und FlipBuffers() nicht genau in dieser Reihenfolge ausführe, reagiert die Maus sehr langsam auf Bewegungen.

Beispiel welches problemlos funktioniert:

Code: Alles auswählen

InitSprite()
InitKeyboard()
InitMouse()

If OpenWindow(0, 0, 0, 500, 500, "Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  OpenWindowedScreen(WindowID(0), 0, 0, 500, 500)
  
  Repeat
    ExamineKeyboard()
    ExamineMouse()
    
    Debug Str(MouseX()) + ", " + Str(MouseY())
    
    WindowEvent()
    
    FlipBuffers()
  Until KeyboardPushed(#PB_Key_Escape)
EndIf
Beispiel welches *NICHT* problemlos funktioniert:

Code: Alles auswählen

InitSprite()
InitKeyboard()
InitMouse()

If OpenWindow(0, 0, 0, 500, 500, "Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  OpenWindowedScreen(WindowID(0), 0, 0, 500, 500)
  
  Repeat
    WindowEvent()
    
    ExamineKeyboard()
    ExamineMouse()
    
    Debug Str(MouseX()) + ", " + Str(MouseY())
    
    FlipBuffers()
  Until KeyboardPushed(#PB_Key_Escape)
EndIf
Man achte bei diesen beiden Beispielen auf die Debug Ausgabe: Beim ersten Beispiel kann man die Maus problemlos bewegen und die Position passt auch dazu. Beim zweiten Beispiel ist es allerdings ziemlich schwierig die Maus zu bewegen. Ich muss da die Maus schon einen halben Meter über den Schreibtisch bewegen damit ich von einem Ende an das andere komme. :mrgreen:

Bei den ganzen 3D Beispielen ist es allerdings auch so, dass WindowEvent() immer vor ExamineMouse() und nach FlipBuffers() aufgerufen wird wodurch ich das Problem auch bei den Beispielcodes nachstellen kann.

Meine Konfiguration:

OS: Ubuntu 20.10 x64
Grafikkarte: NVIDIA GeForce GTX 1080
Treiber: nvidia-driver-450 (proprietary) aus dem Ubuntu Repo
Desktop Environment: Cinnamon unter X.Org
PureBasic: 5.73 x64

Kann das Problem noch jemand reproduzieren?
BildBildBildBild
Benutzeravatar
#NULL
Beiträge: 2235
Registriert: 20.04.2006 09:50

Re: [Linux] Maus in Screen sehr langsam

Beitrag von #NULL »

Du mußt pro Frame/Hauptschleifendurchgang immer alle Events abarbeiten, nicht nur ein Event pro Frame.
Dann kann es auch sein, dass du ein Delay brauchst, wenn dein Programm in der Hauptschleife sonst keinerlei Last hat, da bei zu schnellen Frames die Mouse Lib meistens die Mausebewegungen verschluckt.
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: [Linux] Maus in Screen sehr langsam

Beitrag von mk-soft »

Mal getestet ...

1. Ausserdem störte es mich immer bei den Beispielen das die Mouse nach einem Programmwechsel nicht funktionierte (Alt-Tab)
2. Um die Prozessorleistung noch weiter zu schonen, das Delay( <= 30 sec) immer hinter FlipBuffers() aufrufen, sonst funktioniert MouseXY nicht richtig.

Update
- Maus Ein- Ausschalten (F12 oder 'P')

Code: Alles auswählen

InitSprite()
InitKeyboard()
InitMouse()

Define ActiveMouse = #True

If OpenWindow(0, 0, 0, 500, 500, "Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  OpenWindowedScreen(WindowID(0), 0, 0, 500, 500)
  
  Repeat
    ; Alle aufgelaufende Window Events abarbeiten
    Repeat
      event = WindowEvent()
      Select event
        Case #PB_Event_CloseWindow
          Break 2
          
      EndSelect
    Until event = 0
    
    ExamineKeyboard()
    ExamineMouse()
    
    SetWindowTitle(0, "Screen X=" + Str(MouseX()) + ", Y=" + Str(MouseY()))
    
    FlipBuffers()
    
    ; Damit die Desktop Maus nach Programmwechsel auch funktioniert (Alt-TAB)
    If ActiveMouse And IsScreenActive()
      ReleaseMouse(#False)
    Else
      ReleaseMouse(#True)
    EndIf
    
    ; Delay immer nach FipBuffers()
    Delay(30)
    
    ; Maus Ein- Ausschalten
    If KeyboardReleased(#PB_Key_F12) Or KeyboardReleased(#PB_Key_P)
      Debug ActiveMouse
      ReleaseMouse(ActiveMouse)
      ActiveMouse = ~ActiveMouse & 1
    EndIf
        
  Until KeyboardPushed(#PB_Key_Escape)
EndIf
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Programie
Beiträge: 1280
Registriert: 06.08.2005 22:56
Computerausstattung: https://www.sysprofile.de/id160800
Wohnort: Gernsbach
Kontaktdaten:

Re: [Linux] Maus in Screen sehr langsam

Beitrag von Programie »

#NULL hat geschrieben: 04.05.2021 18:47 Du mußt pro Frame/Hauptschleifendurchgang immer alle Events abarbeiten, nicht nur ein Event pro Frame.
Dann kann es auch sein, dass du ein Delay brauchst, wenn dein Programm in der Hauptschleife sonst keinerlei Last hat, da bei zu schnellen Frames die Mouse Lib meistens die Mausebewegungen verschluckt.
Aber warum funktioniert es dann, wenn ich das WindowEvent() zwischen ExamineMouse() und FlipBuffers() schiebe? Also so wie im ersten Beispiel.

Ein Delay von 30 ms sorgt bei einer einfachen Schleife schon für nur noch etwa 32 FPS (1000/30 = 32). Wenn man dann noch andere Operationen dazu rechnet, zieht das die FPS noch weiter runter.
BildBildBildBild
Benutzeravatar
#NULL
Beiträge: 2235
Registriert: 20.04.2006 09:50

Re: [Linux] Maus in Screen sehr langsam

Beitrag von #NULL »

Programie hat geschrieben: 04.05.2021 22:52 Aber warum funktioniert es dann, wenn ich das WindowEvent() zwischen ExamineMouse() und FlipBuffers() schiebe? Also so wie im ersten Beispiel.
Es werden halt manche Events verarbeitet und manche nicht. Jenachdem wo das WindowEvent() steht und wie die Event-Queue aufgebaut ist, Prioritäten etc., funktioniert dann halt mal das eine oder das andere, aber nie alles, und es ist auch nie korrekt.
Programie hat geschrieben: 04.05.2021 22:52 Ein Delay von 30 ms sorgt bei einer einfachen Schleife schon für nur noch etwa 32 FPS (1000/30 = 32). Wenn man dann noch andere Operationen dazu rechnet, zieht das die FPS noch weiter runter.
Ich dachte eher an ein Delay zwischen 1 und 10ms. Und wenn du die FPS für deine eigentliche Programmlogik brauchst, dann nimmst du natürlich kein Delay mehr und brauchst es auch nicht. Ich habe es oft auch dynamisch zugeschaltet jenachdem wie lange der Frame gebraucht hat. Ich halte es auch nicht für richtig, dass PB bei hohen FPS die Mausebewegungen verschluckt, ist aber halt so. Habe es auch schon vor Jahren berichtet, interessiert aber keinen.
my pb stuff..
Bild..jedenfalls war das mal so.
Antworten