Flimmern beim Zeichnen auf Canvas verhindern?
-
- Beiträge: 124
- Registriert: Mo 6. Sep 2010, 18:39
- OS, Lazarus, FPC: Win 7 (L 1.6 FPC 3.0.0)
- CPU-Target: Win 7
- Wohnort: Mailand
Flimmern beim Zeichnen auf Canvas verhindern?
Hallo zusammen,
ich zeichne auf die Zeichenfläche meines Images "Image1.Canvas".
Dabei wird z.B. für das Visualisieren eines Sortieralgorithmus' ein Feld
von 100 Zahlen durch Balken dargestellt und beim Vertauschen von Zahlen
werden die beiden vertauschten Balken neu gezeichnet.
Screenshot:
Das Projekt läuft unter Delphi einwandfrei, unter Lazarus flackert
das Image ganz furchtbar. Seltsamerweise tritt das Flackern auch
auf, wenn der Algorithmus gaaaaanz langsam (1 Vergleich pro Sekunde)
ausgeführt wird.
Hier http://wiki.lazarus.freepascal.org/Developing_with_Graphics/de wird das
Problem angesprochen, eine Lösung sehe ich aber nicht wirklich (ja, ich habe
-finde ich- genau hingesehen).
Gibt es eine Lösung des Problems?
Danke schonmal.
mintpc
ich zeichne auf die Zeichenfläche meines Images "Image1.Canvas".
Dabei wird z.B. für das Visualisieren eines Sortieralgorithmus' ein Feld
von 100 Zahlen durch Balken dargestellt und beim Vertauschen von Zahlen
werden die beiden vertauschten Balken neu gezeichnet.
Screenshot:
Das Projekt läuft unter Delphi einwandfrei, unter Lazarus flackert
das Image ganz furchtbar. Seltsamerweise tritt das Flackern auch
auf, wenn der Algorithmus gaaaaanz langsam (1 Vergleich pro Sekunde)
ausgeführt wird.
Hier http://wiki.lazarus.freepascal.org/Developing_with_Graphics/de wird das
Problem angesprochen, eine Lösung sehe ich aber nicht wirklich (ja, ich habe
-finde ich- genau hingesehen).
Gibt es eine Lösung des Problems?
Danke schonmal.
mintpc
Re: Flimmern beim Zeichnen auf Canvas verhindern?
Hast du das denn überhaupt getestet:
http://wiki.lazarus.freepascal.org/Deve ... t_zeichnet
Das sollte nicht flackern.
http://wiki.lazarus.freepascal.org/Deve ... t_zeichnet
Das sollte nicht flackern.
-
- Beiträge: 124
- Registriert: Mo 6. Sep 2010, 18:39
- OS, Lazarus, FPC: Win 7 (L 1.6 FPC 3.0.0)
- CPU-Target: Win 7
- Wohnort: Mailand
Re: Flimmern beim Zeichnen auf Canvas verhindern?
Hab ich:
Genau so steht's da.
Irgend etwas stimmt doch da nicht ???
Code: Alles auswählen
Form1.Image1.Picture.Bitmap.Canvas.moveto(7*i,0);
Form1.Image1.Picture.Bitmap.Canvas.lineto(7*i,a[i]);
Genau so steht's da.
Irgend etwas stimmt doch da nicht ???
-
- Beiträge: 124
- Registriert: Mo 6. Sep 2010, 18:39
- OS, Lazarus, FPC: Win 7 (L 1.6 FPC 3.0.0)
- CPU-Target: Win 7
- Wohnort: Mailand
Re: Flimmern beim Zeichnen auf Canvas verhindern?
So, nochmal ich.
Ich hab' jetzt das Image gelöscht und zeichne nur auf das Formular. Und auf
einmal ist das Flimmern weg ???
Was passiert da? Ist TImage so langsam im Grafikaufbau oder ..?
Ich hab' jetzt das Image gelöscht und zeichne nur auf das Formular. Und auf
einmal ist das Flimmern weg ???
Was passiert da? Ist TImage so langsam im Grafikaufbau oder ..?
-
- Beiträge: 770
- Registriert: Sa 21. Feb 2009, 13:46
- OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
- CPU-Target: 32Bit
Re: Flimmern beim Zeichnen auf Canvas verhindern?
Betriebsystem , 32 Bit ? Laz Version , FCP version ?
ok OS wird Windows sein weil Delphi, also bei mir flackert das nicht mehr seit Lazarus 0.9.26 auf WinXp 32Bit. Momentan (0.9.31) klappts auch auf win7 64Bit.
ok OS wird Windows sein weil Delphi, also bei mir flackert das nicht mehr seit Lazarus 0.9.26 auf WinXp 32Bit. Momentan (0.9.31) klappts auch auf win7 64Bit.
Code: Alles auswählen
Signatur := nil;
-
- Beiträge: 657
- Registriert: Sa 9. Jan 2010, 17:32
- OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
- CPU-Target: 64Bit
Re: Flimmern beim Zeichnen auf Canvas verhindern?
Hast du in das Bild im Image gezeichnet oder über das Image darüber?
Falls du letzteres gemacht hast, ist das Flimmern kein Wunder, denn deine und die Zeichenroutine des Images konkurrieren sich gegenseitig, wer auf den Schirm zeichnen darf.
Nimm kein Image, sondern eine PaintBox.
Falls du letzteres gemacht hast, ist das Flimmern kein Wunder, denn deine und die Zeichenroutine des Images konkurrieren sich gegenseitig, wer auf den Schirm zeichnen darf.
Nimm kein Image, sondern eine PaintBox.
-
- Beiträge: 124
- Registriert: Mo 6. Sep 2010, 18:39
- OS, Lazarus, FPC: Win 7 (L 1.6 FPC 3.0.0)
- CPU-Target: Win 7
- Wohnort: Mailand
Re: Flimmern beim Zeichnen auf Canvas verhindern?
Hast du in das Bild im Image gezeichnet oder über das Image darüber?
Das weiß ich leider nicht so genau.
Ich habe stets mit
Code: Alles auswählen
Form1.Image1.Picture.Bitmap.Canvas.lineto(x,y)
gezeichnet. Liegt da ne Konkurrenz vor? Kannst du mir das erklären?
Wie oben schon gesagt, habe ich mal in andere Komponenten (Form, Panel, eben auch die empfohlene
Paintbox) gezeichnet. Hier gibt's kein Flimmern. D.h., es müsste ja an der
TImage-Komponente liegen.
Irgendwo hatte ich auch noch gelesen, dass TImage einfach sehr langsam sei, und daher
bei schnellem Zeichnen flimmern würde.
Klar, das Problem habe ich nun umgangen, ich würde aber trotzdem gerne wissen, warum
das TImage flimmert.
Aber schonmal Danke für die Hinweise, das Problem ist ja nun
abgestellt.
mitpc
-
- Lazarusforum e. V.
- Beiträge: 3158
- Registriert: Di 22. Jul 2008, 19:27
- OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
- CPU-Target: 32bit x86 armhf
- Wohnort: Köln
- Kontaktdaten:
Re: Flimmern beim Zeichnen auf Canvas verhindern?
mintpc hat geschrieben:Klar, das Problem habe ich nun umgangen, ich würde aber trotzdem gerne wissen, warum
das TImage flimmert.
TImage speichert alles Gezeichnete inter (in einem TBitmap oder so was in die Richtung) zwischen. Zeichnest du also auf TImage.Canvas wird in Wirklichkeit nicht auf die Zeichenoberfläche des Steuerelementes sondern auf die des Zwischenspeichers gemalt. Hinterher muss dann das ganze Bild wieder auf die Zeichenoberfläche des Steuerelementes übertragen werden.
Vorteil: Du kannst zeichenen wann und was du willst und musst nicht immer alles in OnPaint machen.
Nachteil: Alles wird zweimal gemalt
(es gibt wohl auch noch einen Unterschied wenn du innerhalb oder außerhalb von OnPaint zeichnest, aber den findest du sicher alleine heraus)
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
-
- Beiträge: 770
- Registriert: Sa 21. Feb 2009, 13:46
- OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
- CPU-Target: 32Bit
Re: Flimmern beim Zeichnen auf Canvas verhindern?
Genau wie Socke es gesagt hat.
ein Image speichert das bild intern , hat den Vorteil das du, wenn das Fenster in den hintergrund geschoben wird und du mit nem anderen mal drüber gehst verschwindet das gemalte nicht...
Probiers also mal mit
ein Image speichert das bild intern , hat den Vorteil das du, wenn das Fenster in den hintergrund geschoben wird und du mit nem anderen mal drüber gehst verschwindet das gemalte nicht...
Probiers also mal mit
Code: Alles auswählen
Form1.Image1.Canvas.Lineto(x,y)
Code: Alles auswählen
Signatur := nil;
-
- Beiträge: 124
- Registriert: Mo 6. Sep 2010, 18:39
- OS, Lazarus, FPC: Win 7 (L 1.6 FPC 3.0.0)
- CPU-Target: Win 7
- Wohnort: Mailand
Re: Flimmern beim Zeichnen auf Canvas verhindern?
Aha
Jetzt sehe ich klarer.
Vielen Dank für die Erklärungen
mintpc
Jetzt sehe ich klarer.
Vielen Dank für die Erklärungen
mintpc