Hallo,
Gut, dann sage doch mal was nen modernen Desktop modern macht (du denkst dabei doch an bestimmte Features oder?).
Ja, ich denke an Compositing und Overlays. Das sind beides Dinge, die man mit einem VESA-artigen Treiber nur unter Schmerzen oder mit einem vollständig anderen Codepfad unterstützen kann.
Auf meine Frage ob das Linux mit seinen Framebuffer-Devices nicht auch macht, hast du leider nicht geantwortet.
Ja, weil Framebuffer Devices eine völlig andere Baustelle sind. Das hängt damit zusammen, dass auf nicht-x86 kein allgemeiner Standard für Textausgabe existiert und Linux daher eine solche API brauchte. Es gibt Framebuffer-Treiber mit Video- und 2D-Beschleunigung (letzteres z.B. der sonst kaputte viafb). Was du eigentlich meinst, ist etwas komplexeres (vgl. KMS), wobei KMS aus Kompatiblitätsgründen die fbdev-API bereitstellt. Das ist in meinen Augen alles historisches Kompatiblitätsgeraffel und mit einem modernem Desktop (Compositing) nicht vereinbar.
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.
Nö, in meiner (sicherlich naiven) Vorstellung ist auch das verdeckte (oder verkleinerte) Fenster in der GUI immer komplett vorhanden (ja ich weiß dass das Speicher kostet) und kann daher sofort ohne mitwirken der Applikation dargestellt werden.
Das ist richtig, bei Compositing ist das auch so. Allerdings kann man - wenn man die Anwendung zum Neuzeichnen auffordern kann - die eigentlichen Buffer auch wegwerfen, wenn der Speicher knapp ist. Die Buffer gehören nur in den Video-RAM, wenn die Grafikkarte das Compositing in Hardware machen kann, sonst sollte man das in den System-RAM tun.
Ich hab mir X11 vor etlichen Jahren nur mal kurz und nur recht oberflächlich angesehen. Vom Konzept her ist das wimre gar nicht mal so verkehrt wenn wohl auch die Umsetzung nicht mehr so ganz Zeitgemäß ist.
Ich kenne nur den Begriff "over-engineered". Einfach viel zu kompliziert und zu sehr auf die 80er-Jahre-Technologien zugeschnitten; inzwischen also total veraltet und größtenteils in den Bibliotheken neu und moderner implementiert. Deswegen ja auch der Ansatz, alles von der Anwendung machen zu lassen.
GTK und Qt machen eigentlich alles in SW und liefern an die GUI nur noch ein fertiges Bitmap, genau das finde ich persönlich eher ungeschickt und von der Performance her auch suboptimal.
Finde ich weniger, denn auch GTK und Qt nutzen Backend-Libraries (z.B. OpenGL oder Cairo), die durchaus hardwarebeschleunigt sein können. Ich bin der Meinung, eine GUI sollte sich weniger um die Innereien der Anwendungen kümmern müssen.
Ich behaupte mal mit einer passenden HW-Unterstützung und der Fähigkeit von der Grafik-Library diese Möglichkeiten auch durch das GUI-System hindurch effizient nutzen zu können sollte man einen schicken und modernen KDE-Desktop auch mit nem 100 MHz Pentium noch flüssig bedienbar machen können.
Das bezweifle ich. Klar kann man mit Spezialchips die CPU entlasten, aber zu der Zeit steckte da nicht mehr drin als ein Framebuffer mit Blitting und 4 MB VRAM. Compositing geht da einfach nicht sinnvoll.
Gut, auch wieder wahr, den Svenska zu ignorieren wäre einfach unhöflich.
lol
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.
Ich glaube da hast Du mich missverstanden. Ich meine das die Anwendung sich z.B. von einem System-Timer regelmäßig antriggern lassen kann, ...
Achso, aber das hat ja mit der GUI nichts zu tun. Dass die Anwendung z.B. einen Timer-Tick jede Sekunde bekommt und ein Bildfenster (GIF-Element) neu zeichnen lässt, ist ja ne System-Sache; sie muss den Button ja auch neuzeichnen, wenn da grad einer mit der Maus draufklickt (oder drüberfährt).
Für richtige Videos sollte natürlich auch ne spezial-API vorhanden sein, obwohl ich schon der Meinung bin das das grundsätzlich auch ohne spezial-API möglich sein sollte solange die RAM-Performance und auch die PCI-Performance dabei gut mitspielen (was heute selbst für Full-HD als gegeben zu betrachten ist).
Wenn der Videodekoder intern mit einem YUV-Farbformat arbeitet (eigentlich immer), und die Grafikkarte direkt YUV malen kann, dann sollte man das nutzen können, besonders weil das bereits eine Komprimierung sein kann. (YUYV = 4 Byte für 2 Pixel, RGB = 3-4 Byte pro Pixel). Interessant wird es dann, wenn du Videos nebenbei laufen lässt und die GUI trotzdem nutzen möchtest.
Für ein einfaches Vollbildvideo kann man das natürlich auch in Software pinseln, aber das verschwendet Rechenzeit und damit Strom.
Scrollen würde ich persönlich ganz anders machen. Ich würde das komplette Bild in den Video-Speicher laden und der Grafikkarte nur noch sagen "da liegt ein Bild mit den Ausmaßen X:Y an Offset Z im Video-RAM, zeichne davon den Teilausschnitt von U:V mit H:W ins Frame an A:B". Wenn gescrollt wird muss dann immer nur U:V angepasst werden und fertig.
Stimme ich zu, allerdings ist das wiederum Aufgabe der Anwendung, das so zu implementieren. Je nach Fall ist das nämlich nicht möglich (wenn z.B. für jeden Scrollvorgang eine Datenbank befragt werden muss und die gesamte Datenbank zu groß ist). Die GUI selbst fordert von der Anwendung ja eigentlich nur den vorgerenderten Buffer und zeichnet ihn.
Das wäre aber nicht mehr effizient. Denn du würdest zeichnen ohne das es Sinn macht. Wieso z.B. den Speicherbus mit einer GIF-Animation belasten, obwohl das Fenster nicht zu sehen ist und das für vllt ein paar Minuten?
Weil es einerseits nicht weh tut, du aber andererseits jederzeit eine aktuelle Vorschau des Fensters anfordern kannst (vgl. die Win7-Taskleiste).
Wenn ich mir überlege, was das auch an CPU Leistung kosten würde, wenn alle meine Tabs ständig am zeichnen wären bzw was sich da einsparen lässt.
Andere Baustelle: Das Tab-Steuerelement weiß, welches Tab sichtbar ist und kann die Redraw-Ereignisse der untergeordneten Fenster weglassen bzw. das Neuzeichnen unterlassen. Ansonsten vermute ich, dass das neuzeichnen gemacht wird (eine Flash-Animation im Hintergrund kostet ordentlich CPU).
Anderes Bsp wäre wenn der Bildschirm aus wäre oder der Bildschirmschoner an wäre, da würden bei dir die Anwendungen alle schön weiterzeichnen. Auch ein blinkender Cursor muss nicht ständig aktualisiert werden, wenn das Fenster eh nicht zu sehen ist.
Der Cursor folgt dem Fokus, ist also immer im Vordergrund.
Du kannst ja ein Ereignis definieren, was das Neuzeichnen unterbindet.
Das trifft auf den PC zu und Smartphones/Tablets sind auf dem besten Weg auch so viel RAM zu haben. Aber von der Rechenleistung her sollte es doch reichen, dass nicht alles in den RAM muss.
Dann musst du auf Compositing usw. komplett verzichten und dich mit den damaligen Technologien zufriedengeben. Das sehe ich bei der GUI etwas anders als sonst, weil da einfach die Möglichkeiten extrem gestiegen sind und ich das nicht als Bloat betrachte.
Ich habe heute erst wieder ein Spiel von 1999 in der Hand gehabt und die mind. Anforderungen lesen sich so, dass gerade mal 32MB RAM (unter Windows ab 95) benötigt werden und trotzdem war die Grafik für die damalige Zeit richtig gut.
Du hast das schon richtig formuliert: Für die damalige Zeit. Nicht für die heutige Zeit. Eine Oberfläche im Win95-Look lässt sich nicht mehr verkaufen und ein paar Dinge, die Compositing bietet, finde ich toll.
Ich würde das so implementieren das die GUI der Anwendung mit dem Return-Wert einer Zeichen-Aktion immer mitteilt ob das gezeichnete überhaupt komplett oder nur zum Teil und gar nicht sichtbar ist (bei gar nicht eventuell noch nach Grund unterteilt: Verdeckt, Minimiert, Monitor-Aus, usw).
Naja, ich würde der Anwendung einfach ein Ereignis schicken, was ihr mitteilt, dass sie vorerst nicht automatisch neuzeichnen muss. Bei normalen Anwendungsfenstern möchte man ja schon gerne ein aktuelles Vorschaubild haben, bei einem Browsertab im Hintergrund sieht man es ohnehin nicht (und wenn, kann man ja ein normales RedrawNow-Ereignis hinschicken).
Wieso muss sich die Anwendung um sowas kümmern? Das hat die GUI zu erledigen. Die Anwendung zeichnet neu wenn sie dazu aufgefordert wurde (was die Anwendung auch selbst tun kann).
Die Anwendung zeichnet neu, wenn sie dazu aufgefordert wurde oder wenn sie es für richtig hält. Ein Ereignis "du bist jetzt nicht sichtbar" und "du bist jetzt wieder sichtbar" reicht da aus, um ihr diese Entscheidung zu ermöglichen.
Die GUI hat sich darum nicht zu kümmern, weil das Anwendungsinterna sind. Entweder, die Anwendung kümmert sich um sich selbst oder sie muss von der GUI wie ein Baby behandelt werden.
Zumal willst du wirklich das eine Anwendung die Laufzeit deines Laptops beeinflusst, nur weil der Programmierer der Meinung war, das es so richtig wäre. Denn diese Methode heißt ja auch, dass die Anwendung das alle ignorieren kann (der Einfachheit wegen und weil es auf den meisten (allen?) anderen System auch so ist) und dann ist nix mehr mit Strom sparen.
Ja, genau das möchte ich. Der Programmierer kann nämlich auch Threads mit einer Endlosschleife im Hintergrund erzeugen und dann bringt das ebenfalls nichts. Wenn ich den Anwendungen nicht ein bisschen vertrauen kann, brauche ich keinen Computer mehr. Da stimme ich Erik vollkommen zu.
So wie ich mir das vorstelle, muss die Anwendung aber nichts darüber wissen ob das Fenster sichtbar ist und in welchem Bereich.
Nein, aber du musst diese Information der Anwendung ja nicht gezielt vorenthalten. Für normale Fenster ist das wirklich total unwichtig, für manche Steuerelemente (wie z.B. Tab-Container) ist das wieder relevant.
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.
Würde ich eher über einen Zustand im Fenster lösen, also das übergeordnete Fenster sagt dem Steuerelement "du bist gerade unsichtbar" und das Steuerelement schickt an das übergeordnete Fenster halt keine "Want Redraw Event"-Events mehr.
Ich finde übrigens folgende Herangehensweise sinnvoller:
- GUI schickt Fenster ein Redraw-Event, das Fenster zeichnet sich neu und antwortet mit einem "RedrawDone"-Event.
- Das Fenster findet, dass es sich neu zeichnen muss, tut das und sendet ein "RedrawDone"-Event.
Warum muss die GUI jedes Fenster antriggern/takten, damit der Bildschirm schicker aussieht? Man kann das zwar mit der Bildwiederholrate synchronisieren, aber wann triggert man eigentlich, wenn zwei Bildschirme mit unterschiedlichen Frequenzen angesteuert werden? (Da jedes Fenster einen eigenen Buffer hat, kann man es auch auf beiden Bildschirmen haben...) Daher sollte die GUI das Fenster nur bei bestimmten Ereignissen antriggern, nicht per Timer.
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.
Vom Toolkit-Programmierer, ja. Nicht vom Anwendungsprogrammierer. Jedes Steuerelement muss selbst wissen, wie es auf bestimmte Ereignisse reagiert.
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.
Richtig. Dort hast du aber auch keine modernen Desktops.
Und Hand aufs Herz - um wieviel % CPU-Zeit geht es denn bei deiner kleinen GIF-Animation? Wenn du einen 486er mit ISA-Grafikkarte optimal ausreizen willst, dann hast du eben kein Compositing und keine Live-Vorschau der Fenster. Punkt. Das geht nicht. Willst du beides optimal unterstützen, hast du zwei komplett getrennte Codepfade, für ein Hobby-OS zuviel Aufwand. Dann bau lieber deinen VESA-Treiber so, dass er Buffer-Management, Compositing usw. im System-RAM durchführt und eine gerade so akzeptable Fähigkeitenliste simuliert.
FlashBurn: Das mit den Ports und dem IPC sind Implementierungsdetails, die ich ziemlich komplex finde. Eine single-threaded Anwendung blockt halt, während sie ein Ereignis verarbeitet, daran lässt sich nichts ändern. Multithreading vorzuschreiben halte ich für unsinnig, außerdem wird das Toolkit das ohnehin schon tun, wenn das für sinnvoll erachtet. Dein Vorschlag definiert genau, wie eine Anwendung intern zu funktionieren hat und das ist in meinen Augen ein Designfehler.
Gewöhn dich daran, dass andere Programmierer anders denken und erschwere ihren Stil nicht über das Notwendige hinaus. Du bist kein Jurist, der alles Unerwünschte verbieten muss.
Gruß,
Svenska