GUI - Ansatz

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

N0X

Betreff: GUI - Ansatz

BeitragDo, Okt 02, 2014 1:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo liebe Community,
ich möchte ein GUI programmieren, welches folgende Features unterstützt:

-> hauptsächlich InGame
-> feste Fenstergrößen
-> Buttons, Textareas, Scrollbars
-> verschiebbar

Ich habe bisher versucht mit WritePixel in eine Pixmap zu schreiben und auch relativ gute Ergebnisse bekommen, allerdings habe ich gelesen, dass dies ineffizient sei besonders wenn es um Echtzeit-Manipulation geht.

Andere mir bekannte Ansätze wären die Fenster auf Quads zu zeichnen und diese vor der Camera zu positionieren oder mit Render2Texture zu arbeiten - wobei ich mir noch nicht ganz erschließen konnte wie das funktioniert.

Was für Ansätze gibt es noch, die zu meinen Bedingungen funktionieren könnten und vor allem Performance-technisch sinnvoll nutzbar sind?

MfG,
N0X
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%

BladeRunner

Moderator

BeitragDo, Okt 02, 2014 9:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Ist die GUI denn in sich im wesentlichen statisch?
Dann wäre meines erachtens nach der beste Weg die Gui-Elemente aus vorgegebenen Versatzstücken in ein Bild zu rendern (Schau Dir mal TPixmap in der Hilfe genauer an) und dieses immer wieder zu zeichnen.
Ansonsten besteht halt die Möglichkeit deine Gui mit standart-Images zu realisieren und immer wieder zu ende einzuzeichnen, so dass sie on-Top liegen.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

N0X

BeitragDo, Okt 02, 2014 12:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Also skalierbar sollen die Fenster nicht sein, beim Erstellen werden sie auf eine Größe festgelegt, die sich nicht mehr ändert.
Positionierbar sollen sie schon sein.

Nach deinem Ansatz bin ich auch schon vorgegangen, aber gibt es nicht Probleme wenn ich z.B. Textareas (die sich ja ständig ändern wenn man tippt) auf Fenster male?
Oder sich ändernder Text angezeigt wird?

Oder sollte ich Diese dann als eigene Images darüber zeichnen?

MfG,
N0X
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%

DAK

BeitragDo, Okt 02, 2014 13:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Du könntest die statischen Teile (z.B. das Fenster selbst) in ein Bild rendern, und den Text danach drüber zeichnen. Das sollte ganz gut gehen.

Wenn du Bilder zeichnest, dann sollte BMax automatisch das Ganze auf Quads zeichnen. Das ist insofern schneller, da die CPU somit der Grafikkarte nur ein Bild und die Position gibt, und die den Rest machen kann.
Mit WritePixel muss die CPU jedes Pixel einzeln zeichnen, was deutlich langsamer ist.
Gewinner der 6. und der 68. BlitzCodeCompo

BladeRunner

Moderator

BeitragDo, Okt 02, 2014 14:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Zu den Textareas: In der Regel wird ein User selten mehr als ein Zeichen pro Frame hinzufügen oder entfernen, daher wäre ein denkbarer Ansatz folgender:
Der Text deiner Area wird zeilenweise gespeichert. Alle Zeilen werden mit einem Flag versehen, welches Veränderung kennzeichnet. Wird eine Zeile verändert, wird der Text einmalig in ein Image gerendert, welches dann eingezeichnet wird.
Da man seltenst mehr als eine Zeile gleichzeitig bearbeitet wird also ab von der aktuellen Zeile idR alles aus einem Image eingerendert, und das geht sehr flott.
Einzige Ausnahme wäre in der Tat ein Verändern der Areagröße, weil hier ja der komplette Text neu umgebrochen wird. Aber den Lag der dabei entsteht wird der User in Kauf nehmen können.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

N0X

BeitragSo, Okt 05, 2014 23:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay, super Danke!

Aber um das WritePixel beim Erstellen des jeweiligen Fensters werde ich wohl nicht herumkommen oder?
Bis jetzt erstelle ich ein Bild mit der vorgegebenen Größe und zeichne dann mit WritePixel in die Pixmap des erstellten Bilds.
Dann wird es per DrawImage ausgegeben.

Ich verstehe nicht ganz, ob ich komplett auf WritePixel verzichten sollte (bzw. den Umgang mit Pixmaps), da ich keine Alternative sehe das Fenster aus seinen Bestandteilen zusammen zu setzen.

MfG,
N0X
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%

juse4pro

BeitragMo, Okt 06, 2014 1:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Könntest auch einfach auf dieses ganze WritePixel Gedöns verzichten und das ganze einfach live rendern (http://en.wikipedia.org/wiki/I..._graphics)). So hab ich das bisher auch immer gemacht.

Thunder

BeitragMo, Okt 06, 2014 23:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Was auch möglich ist: Zuerst mal mithilfe von DrawRect etc. in den Backbuffer zeichnen. Dann mit GrabImage ein Image davon machen und wieder löschen. Wenn man vor dem nächsten Flip alles überschreibt (oder Cls macht), sieht auch keiner was davon. So ein Grab dauert aber eventuell zu lange...

juse4pro

BeitragDi, Okt 07, 2014 4:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Was auch möglich wäre: Per Frame-Buffer-Object auf eine leere Textur schreiben. Da hast du quasi die Möglichkeit auch direkt per DrawText und co auf die Textur zu "malen".
Das alles auf Seite der Grafikarte. Also kein re-Upload notwendig. Theoretisch sogar realtime-tauglich. Smile

BladeRunner

Moderator

BeitragDi, Okt 07, 2014 8:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Ein Beispiel in BMax für FBO würde mich sehr interessieren Smile
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group