3D GUI - welche Methode ist besser..?

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

Wanderer

Betreff: 3D GUI - welche Methode ist besser..?

BeitragFr, Aug 06, 2004 15:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich wollte mich davor bisher immer ein bisschen drücken, aber für mein derzeitiges Projekt (und auch wohl noch viel öfter) bräuchte ich doch mal eine Fenster-Oberfläche -und zwar eine, die kaum zusätzliche Performance benötigt.

Primärziel ist, daß es eben so schnell wie möglich ist, also nicht den Render-Speed in den Keller zieht, auch nicht, wenn zig Fenster geöffnet sein sollten. 'Stures' 2D-Zeichnen der Fenster auf die gerenderte 3D-Welt scheidet also aus -vor allem, weil das ja bei jedem Frame neu gezeichnet, bzw. kopiert werden muß.

Nach einigem Grübeln sind mir da noch zwei andere Ansätze in den Sinn gekommen, von denen ich nicht sicher bin, welcher der beste ist:

Single-Surface GUI
Für alle Fenster wird nur eine Surface angelegt. Alle grafischen Elemente befinden sich also in nur einer einzigen Textur. Jedes Fenster ist quasi nur eine Ansammlung von Quads, die sich aus dieser Textur bedienen.

Arrow Vorteil: Spart Texturspeicher, benötigt nur eine Surface
Arrow Nachteil: Benötigt dafür viele Vertices, denn bei Text z.B. müsste man für jeden einzelnen Buchstaben, aber auch für jeden Button usw. ein eigenes Quad erstellen.

Eine Textur / eine Surface pro Fenster
Hier würde ein Fenster lediglich aus einem einzigen Quad bestehen -den Rahmen und alle Elemente des Fensters (Text, Buttons, usw.) würden in einen Texturbuffer gezeichnet und dann auf dieses Quad gelegt.

Arrow Vorteil: Braucht sehr wenig Vertices, auch die Anzahl der Surfaces sollte noch zu ertragen sein, da die Anzahl der offenen Fenster ja nie ins endlose geht.
Arrow Nachteil: Für jedes Fenster wird eine eigene Textur benötigt, also bei mehreren offenen Fenstern recht hoher Speicherverbrauch. Ausserdem wäre die Texturgröße ziemlich von der Größe des jeweiligen Fensters abhängig (und andersrum).

Welche Lösung scheint euch besser? Oder hat jemand noch einen weiteren Ansatz? -Oder doch lieber zurück zum 2D-Zeichnen..?
 

Jake

BeitragFr, Aug 06, 2004 15:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich bevorzuge die zweite Methode. Die hat den Vorteil, daß du das Grundgerüst (Rahmen etc.) wie 2D auf die Textur "malen" kannst.

Die erste Methode ist sicherlich schneller, hat aber den Nachteil, daß z.B. Rahmen schwer zu zeichnen sind, weil du viele Tris brauchst.

Die Geschwindigkeit der zweiten Methode halte ich auch noch für passabel, zumal du bei Spielen i.d.R. nicht viele Fenster haben wirst.

DC

Sieger des B2D Retro Wettbewerb / Aug 04

BeitragFr, Aug 06, 2004 16:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du die richtigen Vorteile von 3D nicht brauchst (Realtime Alpha, Skalierung, Rotation und Färbung von Objekten ) solltest du auch kein 3D nehmen.

Wenn du dein GUI in 2D machst ist das auch schnell wenn man es richtig macht. Beispielsweise alle GUI Elemente in einen ImageBuffer zeichnen und diesen nur aktualisieren wenn sich auch an dem GUI was ändert. Im Mainloop muss dann nur dieses eine Image eingezeichnet werden, was nur wenig performance kostet.
Core i5 4670K | 4 x 3,40 GHZ | 16 GB Ram | GeForce GTX 960 | HTC Vive | Win 10 Pro
www.UnrealSoftware.de | www.StrandedOnline.de | www.CS2D.com |
www.CarnageContest.com | www.Stranded3.com

eizdealer

BeitragFr, Aug 06, 2004 17:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde die erste Methode bevorzugen, weil sie einfacher zu handhaben ist und deutlich weniger Speicher braucht. Wenn du dich geschickt anstellst brauchst du pro Window nur 18 (9 * 2) Tris + Buttons für schließen und so. Das Handling ist auch viel besser, z.B. wenn der User ein Menü öffnet kannst du einfach ein paar weitere Tris erstellen. Außerdem kann ein Fenster verschiedene Transparenzbereiche haben (z.B. ein undurchsichtiger Button während das Fenster transparent ist). OK, das würde auch per Textur gehen, wär aber relativ aufwändig.

Längere Textfelder würde ich aber unbedingt rendern, weil sonst wirklich ein Speedverlust auftreten kann. Bei Fenstertitel, Menüs etc. solltest du damit auskommen, die Buchstaben mit einzelnen Tris zu erstellen. Menüs und so hat man ja während dem Spiel eh nicht geöffnet, jedenfalls nicht wenn wirklich Action ist und man die Frames braucht. Falls es doch kleinere Fenster während dem ("akuten") Spiel geben soll, würde ich diese eventuell auch rendern.
Mit SingleSurface solltest du einige Tausend Tris darstellen können, ohne bedeutende Speedunterschiede zu bemerken.
Nicht vergessen, die Tris nach dem Erstellen / Verschieben eines Objekts neu zu ordnen (nicht vor jedem Rendern, wie man das bei Partikel Engines machen muss)!
 

Wanderer

BeitragFr, Aug 06, 2004 19:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Argl! Shocked Drei Antworten -drei verschiedenen Meinungen. Das macht mir die Entscheidung im Moment noch nicht leichter... grübel... Haare rauf... Confused

Mr.Keks

BeitragFr, Aug 06, 2004 19:54
Antworten mit Zitat
Benutzer-Profile anzeigen
ich wäre ja auch für die erste... wobe es nicht mal unbedingt snglesurface sein müsste. macht die sache ja unnötig komplizierter...
MrKeks.net
 

Wanderer

BeitragSa, Aug 07, 2004 7:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Was mich an der ersten Methode aber abschreckt, ist z.B. Text. Für jeden einzelnen Buchstaben ein Quad zu rendern, ist kein guter Weg. Also müsste man (zumindest für die Texte) ja sowieso immer eine eigene Textur erstellen, in der man den Text reinzeichnet. Das kommt aber dann fast schon aufs gleiche raus, wie Methode 2.

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group