Ich schreibe ein Haskell-Programm mit Click-and-Drag-Funktionalität, so dass bei jedem Mausbewegungsereignis ein Update auf das Fenster gemalt wird. Im Moment verwende ichWas ist der richtige Weg, um Cairo Updates in Gtk2hs zu rendern?
renderWithDrawable myCanvas update
Allerdings flimmert dies sehr. Mein Verständnis ist, dass ich eine separate zeichnende (eine "Oberfläche"?) Verursachen muss, zu ihr rendern, und dann sie in einer einzelnen Operation auf das Bildschirmfenster blit. Allerdings bin ich verwirrt über den richtigen Weg, dies zu tun.
Ich habe drawWindowBeginPaintRegion
gefunden, die über die Beseitigung von Flimmern spricht. Es ist jedoch in Gtk3 gemäß der Haddock-Dokumente entfernt. Also bin ich mir nicht sicher, ob ich das verwenden soll, da es veraltet zu sein scheint.
Ich habe auch renderWithSimilarSurface
in Kairo gefunden, die etwas ähnliches zu tun scheint.
Ich bin mir auch nicht sicher, wie diese Funktionen zu renderWithDrawable
beziehen: muss ich sie in dieser Funktion verwenden, oder was?
Was ist der richtige Weg?
bearbeiten
Dies scheint eine bekannte Sache, in Kairo zu sein. Ich versuche herauszufinden, wie ich das in Haskell handhaben soll.
Können Sie ein minimales eigenständiges Beispiel veröffentlichen? – Cactus
@Cactus, nicht leicht. Eine Demo des Flicker-Problems würde eine Art Animations- oder Maus-Event-Handler benötigen, um wiederholtes Neuzeichnen durchzuführen, so dass es nicht zu klein wird. Auch der Grad des Flackerns scheint mit der Plattform zu variieren. Stattdessen aktualisiere ich den Beitrag mit Hinweisen zu Diskussionen über das Thema in anderen Sprachen.Das Zeichnen auf eine PixMap und das Blitting auf den Bildschirm scheinen in anderen Sprachen Standard zu sein, also hoffte ich, dass es in Haskell eine kanonische Methode dafür gibt. –
Sie können sich die Funktion 'clip' anschauen. Dadurch können Sie nur das neu Zeichnen, was Sie benötigen (in Ihrem Fall das ursprüngliche Rechteck (alte Position) des gezogenen Objekts und sein neues Rechteck (neue Position)). – antoyo