Canvas - weiße Flitzer vermeiden

Für allgemeine Fragen zur Programmierung mit PureBasic.
Lambda
Beiträge: 526
Registriert: 16.06.2011 14:38

Canvas - weiße Flitzer vermeiden

Beitrag von Lambda »

Wenn man ein größeres Canvas zu rendern hat in dem dann auchnoch relativ viel zu berechnen/zeichnen ist, entsteht beim verändern der größe schnell mal "weiße Flitzer". Ich hoffe ihr wisst was ich damit mein.

Meine Frage ist jetzt, wie kann man die am besten vermeiden? Je nachdem in welchem modus sich mein Lap befindet sind die Flitzer deutlicher oder kaum bemerkbar.

Könnte man mit #WM_SETREDRAW was erreichen? (oder zumindest mal die Grundfarbe(weiß) ändern)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Canvas - weiße Flitzer vermeiden

Beitrag von STARGÅTE »

Ich weiß was du meinst.
Zum einen kannst du SmartWindowRefresh() nutzen.
Zum anderen wäre dein "Zeichnen" schneller, wenn du bei einem ReSize-Event vom Fenster auch nur den Bereich im Gadget neuzeichnest, der sich auch verändert hat.
Ansonsten ist deine Zeichnung einfach zu langsam (Debugger an oder aus ?)

Vielleicht kannst du ja mal ein Beispiel schicken, wo man das flackern eindeutig sieht.

PS: Bei meinem TabBarGadget gibt es dieses Flackern auch, aber erst wenn das gadget wirklich riesig wird.
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
Lambda
Beiträge: 526
Registriert: 16.06.2011 14:38

Re: Canvas - weiße Flitzer vermeiden

Beitrag von Lambda »

Ein Beispiel geht leider nicht, es ist auch wie gesagt unterschiedlich. Wenn ich Illustrator laufen hab schaltet mein Lap das Aero Theme ab, jetzt ist das Flackern sehr deutlich.

SmartWindowRefresh() ist deutlich besser, aber wenn ich z.B mit GDI arbeite und allein schon 1 größeres Bild render -> wieder deutliches Flackern.
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Canvas - weiße Flitzer vermeiden

Beitrag von Danilo »

Code: Alles auswählen

    SendMessage_(GadgetID,#WM_SETREDRAW,#False,0)

        ; resize und redraw

    SendMessage_(GadgetID,#WM_SETREDRAW,#True,0)
    InvalidateRect_(GadgetID,#WM_SETREDRAW,0,1)
#False sperrt das Neuzeichnen:

Code: Alles auswählen

  If OpenWindow(0, 0, 0, 220, 220, "CanvasGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    CanvasGadget(0, 10, 10, 200, 200)

    SendMessage_(GadgetID(0),#WM_SETREDRAW,#False,0)
    
    Repeat
      Event = WaitWindowEvent()
          
      If Event = #PB_Event_Gadget And EventGadget() = 0 
        If EventType() = #PB_EventType_LeftButtonDown Or (EventType() = #PB_EventType_MouseMove And GetGadgetAttribute(0, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton)
          If StartDrawing(CanvasOutput(0))
            x = GetGadgetAttribute(0, #PB_Canvas_MouseX)
            y = GetGadgetAttribute(0, #PB_Canvas_MouseY)
            Circle(x, y, 10, RGB(Random(255), Random(255), Random(255)))
            StopDrawing()
          EndIf
        EndIf
      EndIf    
      
    Until Event = #PB_Event_CloseWindow
  EndIf
EDIT: Während #WM_SETREDRAW gesperrt ist, geht CanvasOutput() nicht.

Was Du mal probieren kannst: Zeichne auf ein Bild statt auf das CanvasGadget
und setze danach die neue Größe des CanvasGadget und Dein neues Bild.

Code: Alles auswählen

        SendMessage_(GadgetID(0),#WM_SETREDRAW,#False,0)
          ResizeGadget(0,10,10,400,400)
          SetGadgetAttribute(0,#PB_Canvas_Image,ImageID(0))
        SendMessage_(GadgetID(0),#WM_SETREDRAW,#True,0)
        InvalidateRect_(GadgetID(0),0,1)
Zeichnen und dann F1 drücken zum anzeigen:

Code: Alles auswählen

  If OpenWindow(0, 0, 0, 420, 420, "CanvasGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    CanvasGadget(0, 10, 10, 200, 200)
    
    CreateImage(0,400,400)
    
    AddKeyboardShortcut(0,#PB_Shortcut_F1,1)
    
    Repeat
      Event = WaitWindowEvent()
          
      If Event = #PB_Event_Gadget And EventGadget() = 0 
        If EventType() = #PB_EventType_LeftButtonDown Or (EventType() = #PB_EventType_MouseMove) ;And GetGadgetAttribute(0, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton)
          If StartDrawing(ImageOutput(0))
            x = GetGadgetAttribute(0, #PB_Canvas_MouseX)*2
            y = GetGadgetAttribute(0, #PB_Canvas_MouseY)*2
            Circle(x, y, 10, RGB(Random(255), Random(255), Random(255)))
            StopDrawing()
          EndIf
        EndIf
      ElseIf Event = #PB_Event_Menu
        SendMessage_(GadgetID(0),#WM_SETREDRAW,#False,0)
          ResizeGadget(0,10,10,400,400)
          SetGadgetAttribute(0,#PB_Canvas_Image,ImageID(0))
        SendMessage_(GadgetID(0),#WM_SETREDRAW,#True,0)
        InvalidateRect_(GadgetID(0),0,1)
      EndIf    
      
    Until Event = #PB_Event_CloseWindow
  EndIf
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
dige
Beiträge: 1247
Registriert: 08.09.2004 08:53

Re: Canvas - weiße Flitzer vermeiden

Beitrag von dige »

Was genau macht eigentlich SmartWindowRefresh() ? Ich kann keinen Unterschied
feststellen. Aktuell habe ich das Problem, das mit der neusten Version PB4.61
ständig ein Flacker Effekt bei der Darstellung von ImageGadgets auftreten.
Sogar wenn man die Alt-Taste drückt.

Da dieses Verhalten definitiv erst ab Version v4.61 auftritt, habe ich es als
Bug gepostet: http://www.purebasic.fr/english/viewtop ... =4&t=50110
"Papa, ich laufe schneller - dann ist es nicht so weit."
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Canvas - weiße Flitzer vermeiden

Beitrag von ts-soft »

SmartWindowRefresh verwendet mehrere Verfahren um das Flackern beim Resizen zu mildern.
Dafür ruckelt es dann beim Resizen :mrgreen:
Was da genau gemacht wird weiß ich allerdings nicht, aber evtl. wird dem Style #WS_CLIPCHILDREN oder ähnlich hinzugefügt,
oder das Neuzeichnen wird kurzfristig deaktiviert usw.

Aber bei Flackern der ImageGadgets wird das wohl eher nicht helfen, es sei denn, die werden Ständig resized.

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Deluxe0321
Beiträge: 336
Registriert: 19.05.2006 00:31
Kontaktdaten:

Re: Canvas - weiße Flitzer vermeiden

Beitrag von Deluxe0321 »

Ich nutze direkt nach OpenWindow(X,Y,Z)

Code: Alles auswählen

SmartWindowRefresh(WindowID.i,#True)
und beim size event (#PB_Event_SizeWindow)

Code: Alles auswählen

  If Event = #PB_Event_SizeWindow
    ;ResizeGadget(X,Y,Z) etc..
    RedrawWindow_(WindowID(WindowID), 0, 0, #RDW_UPDATENOW) 
  EndIf  
Schon flackert und stockt nix mehr, außer das Webgadget(), das hängt !immer! hinterher.

Grüße

Edit: direkt nach dem posten gesehen, der Thread ist schon "alt", sry ;)
Ich habe keine Lösung, aber ich bewundere das Problem.
Antworten