GUI Design gut?



  • Hallo,
    ich wollte für mein kleines 2D Spiel ein GUI erstellen. Da das mein erstes GUI ist, wollte ich fragen ob das Desgin gut ist, und ob es noch Verbesserungsvorschläge gibt.
    Header:

    class Shape {
    public:
    	static enum ShapeType {Rectangle};
    	virtual ShapeType Type() = 0;
    	virtual ~Shape(){};
    	virtual void Draw() = 0;
    	static void SetDevice(LPDIRECT3DDEVICE9);
    	static void SetDimension(int width, int height);
    protected:
    	static LPDIRECT3DDEVICE9 d3dd;
    	static int windowHeight;
    	static int windowWidth;
    };
    
    class Rectangle : public Shape {
    public:
    	explicit Rectangle(float x, float y, float width, float height, DWORD color);
    	ShapeType Type();
    	void Draw();
    private:
    	LPDIRECT3DVERTEXBUFFER9 vBuffer;
    	static unsigned int count;
    };
    
    class GUI {
    public:
    	void Init(LPDIRECT3DDEVICE9 d3dd, int width, int height);
    	void Draw();
    private:
    	std::vector<std::shared_ptr<Shape> > shapes;
    };
    

    Cpp:

    LPDIRECT3DDEVICE9 Shape::d3dd = 0;
    int Shape::windowHeight = 0;
    int Shape::windowWidth = 0;
    
    void Shape::SetDevice(LPDIRECT3DDEVICE9 _d3dd) {
    	d3dd = _d3dd;
    };
    
    void Shape::SetDimension(int width, int height) {
    	windowWidth = width;
    	windowHeight = height;
    };
    
    unsigned int Rectangle::count = 0;
    
    Rectangle::Rectangle(float x, float y, float width, float height, DWORD color) {
    	if ((y + height) > windowHeight) {
    		height = windowHeight - x;
    	};
    	if ((x + width) > windowWidth) {
    		width = windowWidth - y;
    	};
    
    	CUSTOMVERTEX vertices[4] = {
    		CUSTOMVERTEX(x, y, color),
    		CUSTOMVERTEX(x + width, y, color),
    		CUSTOMVERTEX(x, y + height, color),
    		CUSTOMVERTEX(x + width, y + height, color)
    	};
    
    	d3dd->CreateVertexBuffer(sizeof(vertices), 0, CUSTOMDFVF, D3DPOOL_MANAGED, &vBuffer, 0);
    	void* pvoid;
    	vBuffer->Lock(0, 0, &pvoid, 0);
    	std::memcpy(pvoid, vertices, sizeof(vertices));
    	vBuffer->Unlock();
    	++count;
    };
    
    Shape::ShapeType Rectangle::Type() {
    	return ShapeType::Rectangle;
    };
    
    void Rectangle::Draw() {
    	d3dd->SetFVF(CUSTOMFVF);
    	d3dd->SetStreamSource(0, vBuffer, 0, sizeof(CUSTOMVERTEX));
    	d3dd->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);
    };
    
    void GUI::Init(LPDIRECT3DDEVICE9 d3dd, int width, int height) {
    	Shape::SetDevice(d3dd);
    	Shape::SetDimension(width, height);
    	//shapes.push_back(std::shared_ptr<Shape>(new Rectangle(0.0f, 620.0f, 200.0f, 100.0f, D3DCOLOR_XRGB(0,255,255))));
    };
    
    void GUI::Draw() {
    	for (unsigned int i = 0; i < shapes.size(); ++i) {
    		shapes[i]->Draw();
    	}
    };
    


  • wollte ich fragen ob das Desgin gut ist

    Dass ein Design gut ist erkennt man an daran, dass es die Anforderungen erfuellt.
    Damit wir das beurteilen koennen muesstest Du diese aber erstmal nennen.



  • Also im Endeffekt möchte ich, dass man noch über eine Funktion Add(ShapeType type) dem GUI mehrere Elemente anfügen kann und das die Elemente noch bestimme Sachen wie Texturen und Mouseovereffekte bekommen, und das man mit ihhnen interagieren kann, also als ob man Buttons hat.



  • "Anforderungen" heisst, ob die geplante UI eher so oder eher so aussehen soll.



  • Ohne Screenshot kann man auch schlecht über ein GUI Design urteilen, oder?!?



  • Ich meinte natürlich das Code-, Klassen- oder sonstnochwasdesign. Und Anforderungsmäßig eher wie im ersten Screen 😃



  • Für sowas einfaches würd ich gar keine "GUI Klassen" schreiben. Sind ja nur ein paar Texte und Rahmen drumrum.



  • Was schon mal klar ist deine GUI wird so sehr Grafikkartenhungrig werden. Keine Ahnung ob das bei dir eine Rolle spielt. Wenn man aber mit dieser Rechteckklasse seinen Hintergrund mit 8x8 Pixel kachelt, dann wird die Framerate wohl schonmal einbrechen.



  • TGGC schrieb:

    Was schon mal klar ist deine GUI wird so sehr Grafikkartenhungrig werden. Keine Ahnung ob das bei dir eine Rolle spielt. Wenn man aber mit dieser Rechteckklasse seinen Hintergrund mit 8x8 Pixel kachelt, dann wird die Framerate wohl schonmal einbrechen.

    Naja, so Grafikhungrig wirds wohl auch nicht werden, die paar Vektoren schafft auch ne alte Grafikkarte.
    Aber wie würdest da das ganze denn machen?



  • GUIFreak schrieb:

    Naja, so Grafikhungrig wirds wohl auch nicht werden, die paar Vektoren schafft auch ne alte Grafikkarte.

    Warum fragst du ueberhaupt, wenn du es ehh schon besser weisst?



  • Weil ich der Meinung bin, dass die 129600 Vektoren bei 8x8 Vierecken und einer Auflösung 1920x1080 Pixel,
    1. Nicht übermäßig viele sind
    2. Die Dimension zumindestens für mein klein Spielchen viel zu übertrieben
    3. Ich dennoch immer andere Alternativen einbeziehen will, da es immer eine bessere Lösung gibt 😃



  • 120k Vektoren mögen "nicht viel" sein, aber 30k Render-Calls sind definitiv viel. Zu viel wenn du mich fragst.

    p.S.: einen Vertex-Buffer für 4 Vektoren kann man sich denke ich sparen, DrawPrimitiveUP tut's da vermutlich auch.



  • GUIFreak schrieb:

    Weil ich der Meinung bin, dass die 129600 Vektoren bei 8x8 Vierecken und einer Auflösung 1920x1080 Pixel,
    1. Nicht übermäßig viele sind
    2. Die Dimension zumindestens für mein klein Spielchen viel zu übertrieben
    3. Ich dennoch immer andere Alternativen einbeziehen will, da es immer eine bessere Lösung gibt 😃

    Eben. Du hast keine Ahnung. Ich hab Ahnung. So lange du das nicht kapierst, habe ich keinen weiteren Grund fuer Kommunikation mit dir.



  • Die Performance hängt nicht einzig und allein von der Anzahl der Dreiecke ab, die Spielt da heutzutage bei weitem keine Hauptrolle. Ob 32400 Dreiecke viel sind oder nicht hängt von sehr sehr vielen Faktoren ab. Aber wenn du jedes Dreieck einzeln mit einem eigenen Aufruf von DrawPrimitive() malst dann sind, ungeachtet alles anderen, 32400 Dreiecke verdammt viel. Weil nämlich die CPU ihre ganze Zeit damit verbringt tonnenweise mikroskopisch kleine Renderaufträge an die GPU zu schicken welche mit ihrer Winzigkeit die GPU dermaßen unterfordern dass selbige praktisch nichts tut als auf Renderaufträge zu warten.

    Du kannsts aber auch einfach mal ausprobieren wenn du uns nicht glaubst 😉



  • TGGC schrieb:

    Eben. Du hast keine Ahnung. Ich hab Ahnung. So lange du das nicht kapierst, habe ich keinen weiteren Grund fuer Kommunikation mit dir.

    Wenn ich denken würde du hättest keine Ahnung hätte ich gar nicht erst gefragt, aber mir soll recht sein.

    dot schrieb:

    Du kannsts aber auch einfach mal ausprobieren wenn du uns nicht glaubst 😉

    Glauben tu ich euch schon, aber ich habs trotzdem mal ausprobiert, und ich hab mit VSync bei mir eine CPU und GraKa auslastung von nahezu 0% und ohne VSync FPS um die 2000 (mit einer Timerklasse und Fraps getetstet). Deswegen auch meine Aussage.
    Aber wie kann ich denn die Renderalls verringern, wenn ich will, dass jedes Element im GUI "dynamisch" bleibt, ich es also auf Events reagieren lassen kann, oder rumschieben kann?



  • GUIFreak schrieb:

    Glauben tu ich euch schon, aber ich habs trotzdem mal ausprobiert, und ich hab mit VSync bei mir eine CPU und GraKa auslastung von nahezu 0% und ohne VSync FPS um die 2000 (mit einer Timerklasse und Fraps getetstet). Deswegen auch meine Aussage.

    Und das bei 32400 Rechtecken? 😮



  • Ähm nein 😃
    Sorry, ich hab jetzt die Dimensionen von meiner Anwendung genommen und da sind es 1280x720 * 10x10 = 9216 Rechtecke.



  • OK das wundert mich trotzdem noch ein wenig aber versuchs mal mit 32400 😉



  • Hmm, GraKa immernoch bei 0%, der Prozessor springt jetzt aber immer zwischen 0 und 30% rum, was natürlich nicht so dolle ist 😉
    In einem anderen Thread wurde es ja schon angesprochen, was gibt es da für Lösungansätze?



  • EDIT:
    Hab gerade die Antwort von dot im anderen Thread gelesen. Ich werds mal ausprobieren 🙂


Anmelden zum Antworten