Canvas DoubleBuffer möglich?

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
MitjaStachowiak
Lazarusforum e. V.
Beiträge: 395
Registriert: Sa 15. Mai 2010, 13:46
CPU-Target: 64 bit
Kontaktdaten:

Canvas DoubleBuffer möglich?

Beitrag von MitjaStachowiak »

Hallo,
ein viel diskutiertes Thema, ich weiß, aber alle Beiträge, die ich bisher gefunden habe, laufen auf etwas anderes hinaus...

Also: Ich zeichne in meinem Programm die meisten Komponenten mit Canvas komplett selber; also Texte, Linien und am Ende noch einen Rahmen. Bei viel Inhalt fängt spätestens dieser fürchterlich an zu flackern, wenn man im Inneren etwas verschiebt, oder so. Wenn ich das richtig verstanden habe, bewirkt die Eigenschaft DoubleBuffered einer Komponente, dass das Canvas erst in einen Backbuffer zeichnet und dieser dann am Schluss auf den Bildschirm kommt. Anscheinend geschieht dies jedoch nach jedem Zeichnen-Vorgang. Gibt es eine Möglichkeit, den Bufferwechsel manuell einzustellen oder geht das grundsätzlich nicht?

Wenn es nicht geht - welche Alternativen habe ich? Werden z.B. in openGL noch solche (http://www.delphipraxis.net/74538-aero- ... rms-9.html" onclick="window.open(this.href);return false;) Transparenz-Effekte funktionieren?

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Canvas DoubleBuffer möglich?

Beitrag von pluto »

Ich würde es ganz einfach so lösen:
Du erstellst wie im Forum öfter beschrieben einfach eine TBitMap Variable. Und dort zeichnest du dann einmal beim Rendern alles rein und zeichnest dann auch wieder raus.
Aber gebraucht wird es nur beim z.b. Verschieben So könntest du auch wie ich es inzwischen mache, den Canvas austauschen. Beim Rendern Spielt es keine Rolle, worein gezeichnet wird. Du stellst praktisch eine Variable wie DoubleBuffer auf True und stellst dann das Canvas auf die TBitMap Variable um.
Wenn du es nicht mehr brauchst, stellst du es wieder zurück.

Schau dir mal das HTML Panel an. Beim Zeichnen wird genau das gemacht.
MFG
Michael Springwald

MitjaStachowiak
Lazarusforum e. V.
Beiträge: 395
Registriert: Sa 15. Mai 2010, 13:46
CPU-Target: 64 bit
Kontaktdaten:

Re: Canvas DoubleBuffer möglich?

Beitrag von MitjaStachowiak »

Weil ein Umstieg auf OpenGL in meinem Fall zu aufwändig ist, werde ich wohl Deinen Tipp mit dem TBitMap in die Tat umsetzen...

Aber wie macht das denn die LCL? Ein TButton zum Beispiel verwendet doch eigentlich auch Funktionen wie Rectangle oder Textout... Und könnte man nicht einfach das TCanvas auf OpenGL umprogrammieren?
Ich habe da in letzter Zeit ein wenig den Überblick verloren. Seit Aero kann man anscheinend (zumindest auf Windows) transparente und hardwarebeschleunigte Pixelformate vereinen.
Weil die herkömmlichen Funktionen keinen Z-Buffer verwenden, muss doch jedes Objekt, das ein anderes Verdeckt, neu gezeichnet werden, sobald sich das hintere - ändert, aber hier wird anscheinend aus einem Buffer geladen...

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Canvas DoubleBuffer möglich?

Beitrag von pluto »

Aber wie macht das denn die LCL?
Im Prinzip genau so. Wie ich es vorgeschlagen habe.
Ein TButton zum Beispiel verwendet doch eigentlich auch Funktionen wie Rectangle oder Textout... Und könnte man nicht einfach das TCanvas auf OpenGL umprogrammieren?
Leider nein. OpenGL unterscheidet sich zu Stark von Canvas. Eine Möglichkeit wäre: Eine eigene GUI zu erstellen, die mit einer Art Interface Arbeitet. Also z.b. mit einen OpenGL Modus oder einen Canvas Modus. Unter OpenGL könnten die Komponenten anders gezeichnet werden. Auf http://www.delphigl.com" onclick="window.open(this.href);return false; findest du einige OpenGL GUI'S.

Und wie gesagt: DoubleBuffer ist nicht immer Notwendig. Es verlangsamt logischerweise das Rendern. Nutzte es nur da, wo du es brauchst. Z.B. beim Verschieben mit der Maus.
MFG
Michael Springwald

Antworten