So wie ich mir das vorstelle, muss die Anwendung aber nichts darüber wissen ob das Fenster sichtbar ist und in welchem Bereich.
Das die Anwendung auch selbst sagen kann das sie neuzeichnen will heißt nicht das sie das auch macht, das wiederrum entscheidet die GUI.
Sagen wir mal nen Fenster besteht aus nem Message-Port über den es Nachrichten (Events) empfängt. Die einzige Aufgabe dieses Fensters (und des Message-Handlers), ist es auf Events entsprechend zu reagieren. Z.B. wird bei einem Redraw-Event (wo auch der Bereich, der gezeichnet werden soll mit drin ist) wird halt neu gezeichnet und nur dann!
Hat das Fenster jetzt eine Animation, dann schickt jedes Mal wenn eine Änderung nötig ist, eine Nachricht an die GUI (meinet wegen nen Want-Redraw Event) und die GUI entscheidet ob das überhaupt nötig ist (zwecks Sichtbarkeit und sowas). Ist es nötig, wird nen Redraw-Event an das Fenster geschickt, ansonsten nicht.
Die Anwendung selber sollte nach dem MVC Prinzip aufgebaut sein, sprich das Modell ändert sich zwar ständig, aber die View wird nur aktualisiert wenn nötig.
Das Modell kann ja gerne pro GIF Bild schon nen Buffer haben und die View würde diesen nur noch in den entsprechenden Bereich kopieren, aber ob das passiert entscheidet die GUI.
Denn ich als fauler Programmierer (und sind wir nicht alle faul
) würde mich nicht dafür interessieren (und ich möchte meinen dass das unter Windows und auch Java so ist) ob mein Fenster jetzt sichtbar ist und wo, sondern ich zeichne halt immer mit dem Bereich den ich bekomme neu (entsprechend meines Modells).
Du verlangst also vom Programmierer das er sich noch um Dinge kümmern muss, was eigentlich gar nicht sein müsste.
Ich denke bei einer Anwendung die von sich aus zeichnen muss muss der Programmierer sich eh Gedanken über Effizienz und Energieverbrauch machen, da kommt der einfach nicht drumherum, egal was für Konzepte die GUI benutzt.
Ich wünschte es wäre so, aber seien wir doch mal ehrlich. Der PC ist dafür bekannt, dass man alle Probleme mit schnelleren CPUs und mehr RAM erschlägt. Wirkliche Effizienz wird auf der PC Platform nicht groß geschrieben.
Sowas siehst du auf Embedded Systemen und Konsolen. Dort wo die Ressourcen halt stark begrenzt sind.
Edit::
Wo wir gerade bei viel RAM sind. Da du es ja auch so machen willst, das pro Nachricht ein neuer Thread gestartet wird, könnte man sogar folgendes probieren.
Alle Nachrichten die nix mit dem neuzeichnen zu tun haben werden an nen extra Port geschickt und dort läuft dann das Modell. Das Modell hat immer einen Snapshot des aktuellen Zustands der in einem Pointer gespeichert wird (und halt vor nem Zugriff geschützt werden muss, dazu später mehr). Jedes Mal wenn sich was ändern soll, werden die Sachen halt geändert und es wird ein neuer Snapshot erstellt. Dieser muss gegen den vorhandenen (das würde sogar mit nem einfachen xchg gehen und wäre somit atomisch ohne das man den Pointer irgendwie schützen müsste
) ausgetauscht werden. Sollte der alte Snapshot noch vorhanden sein sprich der Pointer ist ungleich null, kann der Snapshot wieder freigegeben werden.
Im Thread vom Fenster (der Port der nur fürs Zeichnen zuständig ist) macht im Endeffekt das gleiche, er holt sich den vorhanden Pointer und tauscht ihn mit null aus. Es wird dann dem Snapshot entsprechend gezeichnet und der Snapshot kann dann freigegeben werden.
Damit hätte man wunderbar Multithreading eingesetzt und hätte beides voneinander getrennt. Ich bin mir gerade nicht sicher ob 2 Snapshots ausreichen würden (mehr dürften eigentlich nicht nötig sein oder?), aber die könnte man ja fest vor allozieren und damit würde das ganze schnell genug (??) sein.
Allerdings würde ich noch mind. einen dritten Thread verwenden. Nämlich einen der CPU intensive Sachen macht, so dass die GUI immer benutztbar ist, auch wenn die Anwendung gerade rechnet (was z.B. ja bei den meisten Packprogrammen gut funktioniert). Wie genau dieser Thread nötig ist, weiß ich im Moment selber nicht, aber das dürfte sich dann beim Programmieren ergeben.
Meine Frage wäre aber, ist solch eine Aufteilung mit den bekannten Libs (Qt und sowas) überhaupt möglich?