Sporadisch zähflüssiger Mousepointer auf WindowedScreen

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
Kurzer
Beiträge: 1618
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Sporadisch zähflüssiger Mousepointer auf WindowedScreen

Beitrag von Kurzer »

Hallo zusammen,

ich habe ein kleines Problem mit meinem Kartenspiel (mein erstes Projekt in PB).

Es handelt sich um einen WindowedScreen auf dem die gesamten
Grafikausgaben u.a. mit 2D und 3D Sprites ausgeführt werden.

Der Screen nimmt nicht die gesamte Fensterfläche ein, so daß
rechts vom Screen gleichzeitig noch Statistikausgaben in ein
EditGadget gemacht werden.

Dort rechts sind auch ein paar CheckBoxen, mit denen ich testweise
einige Programmfunktionen ein/ausschalte.
(Hier ist ein Screenshoot)

Der Mauszeiger wird innerhalb des Screenbereiches durch ein
Sprite dargestellt - der normale Mauszeiger ist in diesem Bereich
disabled.

Und zwar habe ich jetzt den Effekt, daß unter gewissen Umständen
dieser Sprite-Mousepointer sich sehr zähflüssig bewegt.

Normalerweise flutscht das wie verrückt, da ich den Screen aus
performancegründen auch nicht für jeden Framewechsel neu aufbaue.
Die Grafik wird nur generiert, wenn es wirklich nötig ist (z.B.
neue Karten auf den Tisch malen).
Danach wird der gesamte Screen in einem Sprite gesichert.
Mit diesem einen Sprite wird dann bei sekundären Grafikaktionen
(z.B. Mauszeiger neu zeichnen oder ne Anim zeichnen) der Hintergrund
mit einem DisplaySprite neu rekonstruiert.

Wenn ich jetzt die Exe starte und ein wenig mit den Klickern rechts
rumspiele und den Mousepointer dann wieder in den Screen ziehe, dann
kommt es ziemlich regelmäßig vor, daß mein Mousesprite den Bewegungen
meiner Maus nur noch im Zeitlupentempo folgt.

Ich vermute, daß ds was mit dem Messagesystem von Windows zu tun hat,
aber sicher bin ich mir nicht.
Der Eventloop sieht eigentlich auch ziemlich in Ornung aus.

Code: Alles auswählen

  Event = WaitWindowEvent(5) ; This line waits until an event is received from Windows
  
  WindowID = EventWindow() ; The Window where the event is generated, can be used in the gadget procedures
  
  GadgetID = EventGadget() ; Is it a gadget event?
  
  EventType = EventType() ; The event type
  
  Select Event 
    Case #PB_Event_Menu
      MenuID = EventMenu()
      Select MenuID
        Case #NEWGAME
          Debug "GadgetID: #NEWGAME"
        Case #MIXCARDS
          Debug "GadgetID: #MIXCARDS"
        Case #QUITGAME
          Debug "GadgetID: #QUITGAME"
          End
      EndSelect
   
    Case #PB_Event_Gadget
      Select GadgetID
        Case #Button_Test1
          MixCards()
          DrawTable()
        Case #Button_Test2
          DrawTable()
        Case #CheckBox_0
          DrawTable()
        Case #CheckBox_1
          DrawTable()
        Case #CheckBox_2
          DrawTable()
        Case #CheckBox_3
          If GetGadgetState(#CheckBox_3) ; Anim on / off
            ActiveAnim = 1
            ScreenRefresh = #True
          Else
            ActiveAnim = 0
            ScreenRefresh = #True
          EndIf
      EndSelect
;    Case #WM_MOUSEMOVE
;      DrawGraphics()
  EndSelect

  DrawGraphics()
    
Until Event = #PB_Event_CloseWindow Or MenuID = #QUITGAME; End of the event loop
Ich habe hier
mal den Source hingelegt und würde mich über Tipps
zur Lösung des Problems freuen.


Gruß Markus
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.12 x64, OS: Win 11 24H2 x64, Desktopscaling: 150%, CPU: I7 12700 H, RAM: 32 GB, GPU: Intel(R) Iris(R) Xe Graphics | NVIDIA GeForce RTX 3070
Useralter in 2025: 57 Jahre.
Benutzeravatar
Kurzer
Beiträge: 1618
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Beitrag von Kurzer »

Nachtrag: Ich lasse den Code gerade auf einem Win2K System mit einer alten ATI Rage 128 Grafikkarte laufen.
Da ist der zähflüssige Pointer generell vorhanden. Schon vom ersten Start an. :(

Hat jemand eine Idee?

Gruß Markus
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.12 x64, OS: Win 11 24H2 x64, Desktopscaling: 150%, CPU: I7 12700 H, RAM: 32 GB, GPU: Intel(R) Iris(R) Xe Graphics | NVIDIA GeForce RTX 3070
Useralter in 2025: 57 Jahre.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

mir fällt da nur auf, dass du 2x DrawGraphics() drin hast, einmal bei event und einmal immer.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Kurzer
Beiträge: 1618
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Beitrag von Kurzer »

Kaeru Gaman hat geschrieben:mir fällt da nur auf, dass du 2x DrawGraphics() drin hast, einmal bei event und einmal immer.
Ne, ist auskommentiert:

Code: Alles auswählen

;    Case #WM_MOUSEMOVE
;      DrawGraphics() 
PS: Im übrigen sind die Frameraten auf dem Win2K Rechner (der früher Probleme hatte) jetzt nach der Umstellung des Screenaufbaus konstant über 50 pfs. Trotzdem eiert der Spritecursor wie an einem Gummiband gezogen über den Screen.
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.12 x64, OS: Win 11 24H2 x64, Desktopscaling: 150%, CPU: I7 12700 H, RAM: 32 GB, GPU: Intel(R) Iris(R) Xe Graphics | NVIDIA GeForce RTX 3070
Useralter in 2025: 57 Jahre.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

mach doch mal nen regulären immer-loop mit nem Delay(0) drin um die CPU nich zu braten, und schau dann mal...

kann natürlich auch was in deinem DrawGraphics() sein...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Kurzer
Beiträge: 1618
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Beitrag von Kurzer »

Also einen WindowEvent() statt WaitWindowEvent()?
Werde ich mal ausprobieren...

[später...]

Schade das hat leider nix gebracht.

Gruß Markus
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.12 x64, OS: Win 11 24H2 x64, Desktopscaling: 150%, CPU: I7 12700 H, RAM: 32 GB, GPU: Intel(R) Iris(R) Xe Graphics | NVIDIA GeForce RTX 3070
Useralter in 2025: 57 Jahre.
Benutzeravatar
Kurzer
Beiträge: 1618
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Beitrag von Kurzer »

Hmmm, habe die Ursache zumindest eingekreist.

Es liegt irgendwie an meinem Code zum verstecken des regulären Mauszeigers (ShowCursor_()). Da muss ich nochmal prüfen.

Gruß Markus
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.12 x64, OS: Win 11 24H2 x64, Desktopscaling: 150%, CPU: I7 12700 H, RAM: 32 GB, GPU: Intel(R) Iris(R) Xe Graphics | NVIDIA GeForce RTX 3070
Useralter in 2025: 57 Jahre.
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

Nur so ne Frage am rande, du weist doch, dass Windows eine DLL hat,
die alle Karten als Bild gespeichert hat, oder? Ich denke, die würden
besser aussehen als ein weißer Kasten und eine Zahl darin.
Bild
Benutzeravatar
Kurzer
Beiträge: 1618
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Beitrag von Kurzer »

MVXA hat geschrieben:Nur so ne Frage am rande, du weist doch, dass Windows eine DLL hat, die alle Karten als Bild gespeichert hat, oder? Ich denke, die würden
besser aussehen als ein weißer Kasten und eine Zahl darin.
Jo, das weiß ich... wenn ich auch noch nicht weiß wie man die benutzt.
Aber ich denke, daß dort nur "normale" Kartenbilder enthalten sind und keine speziellen SkipBo-Karten. :)

Davon ab sind das hier natürlich erstmal nur Testgrafiken. Ich investiere ja nicht nen Haufen Zeit in die Grafik, wenn der Code noch nicht steht. ;)

Gruß Markus
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.12 x64, OS: Win 11 24H2 x64, Desktopscaling: 150%, CPU: I7 12700 H, RAM: 32 GB, GPU: Intel(R) Iris(R) Xe Graphics | NVIDIA GeForce RTX 3070
Useralter in 2025: 57 Jahre.
Benutzeravatar
Kurzer
Beiträge: 1618
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Beitrag von Kurzer »

So, Problem gelöst (aber nicht verstanden).

Ursache was das große Sprite, in das ich nach dem einmaligen Aufbau des Screen die gesamte Screengrafik hinein-grabbe.

Dann, wenn sich z.B. die Maus bewegt oder Animationen laufen, wird der Screen durch dieses große Sprite wieder restauriert bevor das Maussprite oder die Animation gezeichnet wird.

Das Problem trat auf, wenn ich als Modus für GrabSprite 0 benutzt habe:

Code: Alles auswählen

Ergebnis = GrabSprite(#Sprite, x, y, Breite, Hoehe [, Modus])

Der 'Modus' Parameter ist optional und kann folgende Werte annehmen: 
  0                 : Normaler Modus, das Sprite befindet sich im Video-Speicher (wenn möglich)
  #PB_Sprite_Memory : das Sprite wird in den Hauptspeicher des PC geladen (für SpecialFX)
  #PB_Sprite_Alpha  : das Sprite ist in 8 Bit, grau und wird mit DisplayAlphaSprite() oder DisplayShadowSprite() benutzt
  #PB_Sprite_Texture: das Sprite wird mit 3D Unterstützung erstellt, nützlich für den CreateSprite3D() Befehl der Sprite3D Library.
Nehme ich #PB_Sprite_Memory, also wenn das Sprite nicht in den Videospeicher geladen wird, dann gibt es keine Mausverzögerungen mehr.
Allerdings wird dann mein Statusgadget nicht mehr aktualisert, solange ich die Maus bewege. Das wird jetzt vermutlich damit zusammenhängen, daß keine Rechenzeit mehr für das Repaint des Gadgets da ist solange er das Riesensprite aus dem Memory kopieren muß.

Genau erklären kann ichs mir nicht. Leider bin ich mit den Internas der aktuellen PC Hardware nicht so firm (beim Amiga hätte ichs sicherlich nachvollziehen können). Aber vielleicht hat jemand anderes eine plausible Erklärung für das Phänomen.

Gruß Markus
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.12 x64, OS: Win 11 24H2 x64, Desktopscaling: 150%, CPU: I7 12700 H, RAM: 32 GB, GPU: Intel(R) Iris(R) Xe Graphics | NVIDIA GeForce RTX 3070
Useralter in 2025: 57 Jahre.
Antworten