Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: bitmaster am 10. May 2006, 20:43
-
Hi,
wie ihr ja alle wisst, progge ich an einem OS mit GUI. Ich habe auch schon einiges. Ich bin jetzt bei dem Thema "Fenster". Da tue ich mich aber schwer. Ich habe keine richtige Idee wie ich das machen soll. Also es darf ja nur ein Fenster in einem Task laufen, wenn man einen Pixel schreibt muss man prüfen ob dort das Fenster überhaupt zu sehen ist, wenn man einen Button drückt der nur halb zu sehen ist, darf er nur halb eingedrückt gezeichnet werden usw. Auch wenn ich Fenster verschiebe, muss ich ja vorher das abspeichern, was unter dem Fenster ist. Also ich habe keine richtige Vorstellung wie ich das machen soll. Ich bräuchte eure Hilfe. Einige von euch haben ja schon eine GUI mit Fenstern. Habt ihr euch die Metode ausgedacht oder habt ihr Infos dazu? Könnt ihr mir helfen? danke!!!
bitmaster
-
also ich hab im videotreiber eine funktion, die das sichtfeld einstellt, und dann nur die pixel, die gesehen werden können zeichnet. das fenster ist bei mir eine unterklasse von "gui_element" und enthält damit eine liste mit seinen unterobjekten (auch vom typ "gui_element"), die dann beim zeichnen des fensters abgerufen wird.
das ist aber alter code... ich schreibe grad an einer userlevel gui, die wird vermutlich ganz anders (?)
du könntest dir dazu doch einfach mal den guimanager in der irrlicht engine ansehen, oder andere bibliotheken, die sowas implementiert haben.
maumo
-
also ich hab im videotreiber eine funktion, die das sichtfeld einstellt, und dann nur die pixel, die gesehen werden können zeichnet. das fenster ist bei mir eine unterklasse von "gui_element" und enthält damit eine liste mit seinen unterobjekten (auch vom typ "gui_element"), die dann beim zeichnen des fensters abgerufen wird.
das ist aber alter code... ich schreibe grad an einer userlevel gui, die wird vermutlich ganz anders (?)
du könntest dir dazu doch einfach mal den guimanager in der irrlicht engine ansehen, oder andere bibliotheken, die sowas implementiert haben.
maumo
Hmm... Was ist "guimanager in der irrlicht engine"? :oops:
-
also die irrlicht engine ist eine 3d engine. der guimanager ist die klasse, die die fensterverwaltet. theoretisch gesehen könntest du den in deinem system unterbringen, müsstest halt nur den videotreiber in der engine anpassen^^.
-
also die irrlicht engine ist eine 3d engine. der guimanager ist die klasse, die die fensterverwaltet. theoretisch gesehen könntest du den in deinem system unterbringen, müsstest halt nur den videotreiber in der engine anpassen^^.
Verstehe zwar immer noch nicht wovon du sprichst, aber ich werde mal schauen wie ich das so machen werde.
bitmaster
-
Benutz doch einfach einen ZBuffer.
Für jeden Pixel reservierst du ein Byte in dem du die "höhe" des gezeichneten Objektes speicherst.
Wenn du mehrere Fenster geöffnet hast, werden sie ja in einer bestimmten Reihenfolge sortiert. (das Aktive Fenster z.B. ganz vorne mit der 0)
0000
0000
1000011
111111122
222222
222222
Du must dann nur jedesmahl wenn du einen pixel zeichnest nachschauen ob der Wert im ZBuffer größer oder kleiner ist.
if zbuffer[pixel_pos] < fenster_hoehe then begin
zbuffer[pixel_pos] := fenster_hoehe;
pixel[pixel_pos] := farbe;
end;
-
Wenn dus nicht unbedingt auf Performance anlegst, kannst einfach alles Zeichnen... Hast an sich ne verkettete Liste mit Fensterelementen (so ein Element enthält vermutl. direkt irgendeine Grafik die direkt gezeichnet werden kann, Gadgetlisten die einzeln gezeichnet werden tuns natürlich auch -> allerdings wird dann frei zeichnen problematisch, kannst evtl. kombinieren). Es wird einfach die Liste von HINTEN NACH VORNE abgearbeitet und gezeichnet, das erste Element in der Liste ist das aktive Fenster (erstes Element wird zuletzt gezeichnet, ist also vorne...). Anderes Fenster aktivieren -> Element an erste Position verschieben. Wenn du Maus etc. abfragen willst (also zu welchem Fenster gehört), kannst einfach die Liste von vorne bis hinten durchgehen und da auf die jeweiligen Koordinaten prüfen... Wenn dus halt schneller haben willst, find nen weg verdeckte Flächen automatisch zu finden ;)
Edit: Grad den Beitrag mit den zbuffern gelesen, war da schon am tippen... das wär z.b. ne Möglichkeit um das Zeichnen zu optimieren ;) hab ich aber nicht implementiert
-
@Osbios: Jo, so änlich hab ich mir das auch gedacht. Nur was meinst du mit Fensterhöhe?
danke!!!
-
Einfach wie weit vorne das Fenster ist... z.b. müsste das Aktive Fenster das im VOrdergrund ist die Höhe 1 haben, das dahinter 2, ...
-
Einfach wie weit vorne das Fenster ist... z.b. müsste das Aktive Fenster das im VOrdergrund ist die Höhe 1 haben, das dahinter 2, ...
Wieso muss das denn? Kann man denen nicht einfach irgendwelche Nummern zuweisen? Was wäre denn, wenn ein anderes Fenster in den Vordergrund kommt?
bitmaster
-
dann schiebst du das neue aktive Fenster an POS 1... siehe die Listen wie ich sie verwende ;) 1. Element ist das aktuelle Fenster, und hat damit Index 1 -> den Listenindex kannst direkt verwenden (wenn bei 1 anfangend, ansonsten +1 ;) )
-
@blueXseven: Cool, danke. Das mit dem Desktop als Fenster ohne Rahmen hab ich mir auch schon so gedacht.
auserdem kopiere ich nur die zeilen, die tatsächlich verändert wurden.
Und wie weißt du - wenn du jetzt im Arbeitsspeicher alles so stehen hast, dass du es jetzt im Grafikspeicher kopieren kannst - was davon nur verändert wurde?
vielen dank!!!
-
wenn ein objekt gezeichnet wird, werden die y position und die höhe gespeichert.
beim nächsten objekt wird geprüft ob es auch in diesem bereich ist.
wenn nicht wird der bereich nach oben oder unten vergrössert.
Kapier ich nicht. Und was ist mit X und Breite? Was wird vergrößert? hä?
-
also der nullpunkt des bildschirms ist ja oben links.
nach rechts ist x und nach unten ist y.
wenn ich mir jetzt y merke, weiss ich ab welcher zeile ich aktualisieren muss.
und mit der höhe wieviele zeilen es sind.
die x position und die breite benutze ich nicht,
da immer nur ganze zeilen kopiert werden.
Ach so, jetzt habe ich verstanden. Mache ich aber anders. Ich werde warscheinlich nur das schreiben, was verändert wurde. danke!!!
bitmaster
-
So, ich habe mir jetzt alles auf Papier geschrieben wie ich es machen werde (kann was dauern dies umzusetzen ;) ). Hoffe nur das, dass zwischenspeichern vor dem Zeichnen nicht all zu lange dauert und der User erst einmal lange warten muss bis überhaubt gezeichnet wird. Aber das Speichern im Arbeitsspeicher dürfte ja schneller sein als im Grafikspeicher, oder?
bitmaster
-
ja is es..
-
So, ich bin jetzt schon viel weiter. Habe aber noch eine Frage. Wie macht ihr das so mit Pixel zeichnen? Ich meine man muss ja auf die Maus rücksicht nehmen. Da wo die Maus ist darf man ja nicht zeichnen, aber es muss zwischengespeichert werden, wenn die Maus dann verschoben wird muss es ja zu sehen sein. Prüft ihr bei jedem setzen eines Pixel ob da die Maus ist etc. oder löscht ihr den Cursor und setzt den anschließend neu? Was ist schneller, besser, oder gibts noch was besseres?
danke!!!
-
cursor "löschen", alle(!) pixel zeichen, cursor zeichen. ist das schnellste.
-
cursor "löschen", alle(!) pixel zeichen, cursor zeichen. ist das schnellste.
Ich kann mir net vorstellen das es besonders schnell ist, den ganzen Bildschirm neu zu zeichnen, wenn man die Maus verschiebt. Ich hab zwar noch keine Erfahrung mit Gui, aber ich würd immer des was hinter dem zu zeichnenden Cursor ist speichern und wenn sich die Maus verschoben hat wieder an die Stelle zurückkopieren.
-
ja, aber wenn mans speicher muss es beim anzeigen wieder neu gezeichnet werden ;)
-
bluecode: ich bezog mich auf das pixel zeichen. wenn der mauszeiger neugezeichnet werden soll, weil die maus verschoben wurde, hast du natürlich recht.
-
mir ist eine blizzidie eingefallen, die recht schnell sein dürfte:
man speichert die aktuelle cursorposition, und die pixel die drunter sind, dann muss man den cursor duch die gepsicherten pixel ersetzen und nur die maus pixel an einer anderen position setzen
-
man speichert die aktuelle cursorposition, und die pixel die drunter sind, dann muss man den cursor duch die gepsicherten pixel ersetzen und nur die maus pixel an einer anderen position setzen
sag/mein ich doch :wink:
-
man speichert die aktuelle cursorposition, und die pixel die drunter sind, dann muss man den cursor duch die gepsicherten pixel ersetzen und nur die maus pixel an einer anderen position setzen
sag/mein ich doch :wink:
achso, dann sorry ^^
-
Na so mache ich das ja auch. Aber wenn ich jetzt ein Fenster neu zeichne, was fast so groß wie der ganze Desktop ist, und dabei jeden Pixel abfragen lasse ob dort der Cursor ist wenn ja dann blablabla. Dann ist dies unter Bochs mehr als langsam. Da das bei den anderen GUI von euch nicht so ist, wollte ich halt wissen warum. Wieso ist das bei euch nicht so langsam? Was macht ihr anders?
bitmaster
-
Unter Bochs ist eine GUI sowiso immer langsam...
Du kannst ja nachdem du ein Fenster gezeichnet hast, die Position der Maus neu abfragen und dann zeichnen.
Wenn kein Fenster gezeichnet wurde, würde es so machen, dass in einem kleinem Speicherabschnitt immer gespeichert wird, was hinter dem Cursor ist und gegebenenfalls dann verwendet wird.
Gruss
Nooooooooooos