Canvas - weiße Flitzer vermeiden
Canvas - weiße Flitzer vermeiden
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)
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)
Re: Canvas - weiße Flitzer vermeiden
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.
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
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Re: Canvas - weiße Flitzer vermeiden
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.
SmartWindowRefresh() ist deutlich besser, aber wenn ich z.B mit GDI arbeite und allein schon 1 größeres Bild render -> wieder deutliches Flackern.
Re: Canvas - weiße Flitzer vermeiden
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)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
EndIfWas 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)
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
EndIfcya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Re: Canvas - weiße Flitzer vermeiden
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
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."
- 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
SmartWindowRefresh verwendet mehrere Verfahren um das Flackern beim Resizen zu mildern.
Dafür ruckelt es dann beim Resizen
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
Dafür ruckelt es dann beim Resizen
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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

- Deluxe0321
- Beiträge: 336
- Registriert: 19.05.2006 00:31
- Kontaktdaten:
Re: Canvas - weiße Flitzer vermeiden
Ich nutze direkt nach OpenWindow(X,Y,Z)
und beim size event (#PB_Event_SizeWindow)
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
Code: Alles auswählen
SmartWindowRefresh(WindowID.i,#True)Code: Alles auswählen
If Event = #PB_Event_SizeWindow
;ResizeGadget(X,Y,Z) etc..
RedrawWindow_(WindowID(WindowID), 0, 0, #RDW_UPDATENOW)
EndIf
Grüße
Edit: direkt nach dem posten gesehen, der Thread ist schon "alt", sry
Ich habe keine Lösung, aber ich bewundere das Problem.