Flimmern beim Zeichnen auf Canvas verhindern?

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
mintpc
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?

Beitrag von mintpc »

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:
K640_sort.JPG


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

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Flimmern beim Zeichnen auf Canvas verhindern?

Beitrag von theo »

Hast du das denn überhaupt getestet:
http://wiki.lazarus.freepascal.org/Deve ... t_zeichnet
Das sollte nicht flackern.

mintpc
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?

Beitrag von mintpc »

Hab ich:

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 ???

mintpc
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?

Beitrag von mintpc »

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 ..?

MAC
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?

Beitrag von MAC »

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.

Code: Alles auswählen

Signatur := nil;

mintpc
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?

Beitrag von mintpc »

Hä?

carli
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?

Beitrag von carli »

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.

mintpc
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?

Beitrag von mintpc »

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

Socke
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?

Beitrag von Socke »

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

MAC
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?

Beitrag von MAC »

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

Code: Alles auswählen

Form1.Image1.Canvas.Lineto(x,y)

Code: Alles auswählen

Signatur := nil;

mintpc
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?

Beitrag von mintpc »

Aha :!:

Jetzt sehe ich klarer.

Vielen Dank für die Erklärungen :wink:

mintpc

Antworten