Hallo,
also mir persönlich gefällt das Konzept wo die Anwendung dazu aufgefordert wird Teile oder alles ihrer Fenster neu zu zeichnen absolut gar nicht.
Naja, wenn ich ein Fenster verschiebe, dann muss das Fenster, was da vorher (teilweise) hinter gelegen hat, davon erfahren und den Teil, der gerade freigelegt wurde, neu zeichnen. Das ist zwingend notwendig, wenn du kein Compositing betreibst. Denn dann hat das Fenstersystem einen kompletten Puffer der Anwendung und kann selbst neu zeichnen.
letzteres ist z.B. für einen Video-Player von Interesse
Eher weniger, weil die Videodarstellung in der Regel hardwarebeschleunigt gemacht wird. Wenn nicht, ist die Darstellung für vernünftiges Video ohnehin zu langsam. Übrigens: Die GUI triggert das Neuzeichnen, die Anwendung zeichnet neu und informiert die GUI über den neu gezeichneten Bereich. Das heißt nicht, dass die Anwendung das nicht aus sich selbst heraus könnte (sonst würden sich Fensterinhalte ohne externe Ereignisse nie ändern können).
Was du vorschlägst, ist Compositing.
Meiner persönlichen Meinung nach ist es extrem wichtig das die GUI immer voll funktionsfähig ist egal ob die Anwendungen reagieren oder nicht.
Die Idee, dass die Anwendung dem GUI-System mitteilt, wo die entsprechenden Buttons sitzen, finde ich garnicht so abwegig. Fakt ist, dass Anwendungen eigentlich alles über eine Library zeichnen, die entsprechende Funktionalität für Titelleisten usw. muss man nicht nochmal extra im GUI-System duplizieren. Theming ist ein Grund dafür, direktes Rendering auch - und insbesondere Spiele und Vollbildanwendungen wollen keine GUI-eigenen Titelleisten, sondern was eigenes.
Mit Wayland wird allem Anschein nach mehr Funktionalität in die Software verlagert obwohl die Anwendungen versuchen mehr Funktionalität in die Hardware zu verlagern
Guck dir das X11-Protokoll an und sage mir, ob du das gut findest.
Effektiv wird ein Großteil des heute irrelevanten Desktops weggelassen und soweit zurechtgestutzt, dass der Grafiktreiber eine Menge beschleunigen kann. Das setzt aber immer einen modernen Grafiktreiber voraus, VESA ist da nicht geeignet. Die Art und Weise, wie Windows 3.1x arbeitet, ist für solch primitive Hardware optimal - aber Theming, Compositing und große Buffer sind damit nicht sinnvoll möglich.
Eine Anwendung, die mit GTK oder Qt geschrieben ist, braucht die Funktionalität, die GTK oder Qt bieten, nicht nochmal extra aus dem GUI-System benutzen. Von daher sehe ich keinen wirklichen Rückschritt.
Ich würde lieber möglichst fiele Funktionen die die Qt-Library anbietet direkt in HW realisieren
Ein Grafiktreiber und/oder ein GUI-System, das nur Qt anbietet, halte ich für ungeeignet. Die Idee, Compositing vorauszusetzen, finde ich gut - auch, wenn das bei primitiven Grafikchipsätzen heißt, dass das Bild im System-RAM zusammengesetzt und dann an die Grafikkarte geschickt werden muss.
Bei vorhandener 3D-Unterstützung sind alle Fenster nur Texturen, die man zusammenbauen kann und liegen im Grafikspeicher vor. Selbst mittelgroße Embedded Devices können das.
Hat man Hardwarebeschleunigung nutzt man doch genau dafür BitBlt (das vergleicht doch und kopiert nur das was sich geänder hat, oder?).
Nicht wirklich. Um Veränderungen feststellen zu können, brauchst du beide Daten, müsstest also allein dafür schon das ganze Bild über den Bus schieben.
Was sich geändert hat, weiß das GUI-System (und kann ein Redraw für den betroffenen Bereich anfordern) oder die Anwendung (muss nur den betroffenen Bereich neu zeichnen und die GUI informieren). Daraus ergibt sich, welche Teile überhaupt kopiert werden müssen.
Außerdem ist ja auch beim IPC der Caller-Thread, vom GUI-Prozess, so lange blockiert bis das IPC eine Antwort (den neuen Fensterinhalt) zurück liefert. Der Punkt ist einfach dass das angetriggerte Zeichnen unbekannt lange dauert und damit für eine GUI die der User jetzt bedienen möchte eigentlich nicht tragbar ist.
Das muss nicht sein. Die Antwort auf ein "bitte jetzt [32:48] bis [128:96] neu zeichnen" muss nicht mit einem Bildschirminhalt beantwortet werden. Die Antwort kommt per asynchronem Event "ich bin fertig". Das GUI-System muss
dann den neuen Inhalt übertragen.
Wer redet denn von synchronem IPC? Grafische Nutzeroberflächen sind asynchron.
Das eine Anwendung wissen können sollte ob ihr Fenster überhaupt sichtbar ist ist aber auch wieder richtig.
Warum muss das die Anwendung wissen? Wenn sie keine Redraw-Events bekommt, muss sie auch nicht neu zeichnen. Die wenigsten Anwendungen müssen ihren Bildschirminhalt ständig neu aktualisieren (und Video-Player nutzen lieber eine spezielle Schnittstelle dafür).
Hier wäre es noch cool wenn die Anwendung das erneute Zustellen von Bedien-Events erst wieder freischalten muss und vorher sämtliche Mausklicks und Tastendrücke einfach nur ins leere gehen
Dagegen. Events vom Benutzer wegwerfen ist immer falsch. Wenn ich ein Fenster anklicke, was gerade beschäftigt ist, dann will ich nicht, dass ich ignoriert werde.
All das geht aber eben nur mit einem flexiblen Konzept das IMHO auch bedingt das nicht die GUI die Anwendungen antriggert ihre Fenster zu aktualisieren sondern das die Anwendungen das nur tun wenn es tatsächlich echte Events gibt.
Erstmal schließt das eine das andere ja nicht aus und zum zweiten ist der Flash-Player im Browser höchstwahrscheinlich ein Subfenster des Browsers. Selbst, wenn der Flash-Player in einem anderen Anwendungskontext läuft! Ein Redraw-Event für den betroffenen Bereich muss der Browser also einfach nur an seine Subfenster weiterleiten.
In Windows sind die meisten Steuerelemente als Fenster realisiert, sie sehen nur nicht so aus.
Stell Dir einfach mal ein animiertes GIF vor (um z.B. eine kleine Fortschrittsanimation anzuzeigen), da könnte doch die Anwendung sich immer per Event antriggern lassen
Das betrachte ich als vom Design her kaputt. Das GUI-System hat sich nicht dafür zu interessieren, was die Anwendung darstellen möchte. Spezialfälle wie Animationen kann die Anwendung selbst erledigen - entweder durch Pixelschubsen oder eine spezielle Video-API. Die Anwendung zeichnet einfach neu, was neu gezeichnet werden muss und informiert die GUI darüber. Ob das auch real auf dem Bildschirm erscheint, ist der Anwendung egal. Alles andere verlagert überflüssige Komplexität in die Anwendungen und sorgt dafür, dass alternative Darstellungsmechanismen nicht möglich sind. Der Zustand "minimiert" hat auf einem Tablet ohne Taskleiste keine Bedeutung, ebenso wie "überlappt sich mit einem anderen Fenster" bei einem Tiling Window Manager eher unmöglich ist. Warum soll die Anwendung sich darum kümmern müssen?
Nein, BitBlt ist im Prinzip nur ein Kopieren mittels DMA.
Wobei je nach Hardware auch eine Bitoperation gemacht werden kann (z.B. XOR beim Cursor).
Gruß,
Svenska