Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

1

15.09.2011, 21:43

glGet*

Ich lese immer öfter, dass man glGet* Aufrufe wenn möglich vermeiden sollte.
Aber wie soll ich dann am besten rausfinden, ob ich meine Texture binden muss/soll, oder nicht, da ggf. noch keine andere gebunden ist?
Also mein bisheriger Code schaut so aus

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
    bool bind() const {
        GLint active_tex;
        glGetIntegerv(GL_TEXTURE_BINDING_2D, &active_tex);

        if (active_tex != this._texId) {
            //writefln("a: %d, b: %d", active_tex, this._texId);
            glBindTexture(GL_TEXTURE_2D, this._texId);

            return true;
        }

        return false;
    }

Sollte ich das vermeiden und sie einfach binden lassen oder es so lassen oder mir gar einen eigenen, kleinen StateTracker bauen?
Wie machen die großen Jungs das? ;)

P.S.: Ich arbeite derzeit mit OpenGL 2.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

15.09.2011, 21:57

Ist doch dein Code, wer sonst sollte also besser wissen, wann was wie wo gebunden ist, als du!?

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

3

15.09.2011, 22:07

Ich binde einfach eine neue Textur da eh immer nur eine gebunden sein kann. Da durch hast du nicht für 100 Texturen 100 IF Schleifen und 100 glGets.

Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

4

15.09.2011, 22:52

Hab mir für Texturen eine Klasse gebaut. In der Game Loop rendere ich nun Texturen mit dem Aufruf der Methode draw, welche wiederum die Methode bind intern aufruft. Denn habe ich mehrere Texturen, muss jede wieder gebunden und dann gezeichnet werden. Aber habe ich lediglich eine Texture wird diese halt immer und immer wieder gebunden. Deswegen meine Idee, abzufragen, ob das binden überhaupt notwendig ist. Und das würde ich halt so gerne automatisieren. Funktioniert ja auch bestens, nur, da ich gehört habe das glGet* Aufrufe langsam sind, wollt ich eben fragen, wie ihr das löst. ;)
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

15.09.2011, 22:58

Das ist leider eines der großen Probleme von OpenGL: Das Objektmodell ist ziemlich kaputt. Wie du gerade herausgefunden hast, ist es daher praktisch unmöglich, OpenGL in objektorientierter Weise sauber und effizient zu wrappen. Das macht aber auch gar nix, da so ein Wrapper meiner Erfahrung nach sowieso keine gute Idee ist. Besser eine richtige Abstraktion auf höherer Ebene bauen.

Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

6

15.09.2011, 23:02

Also was soll ich deiner Meinung nach tun? Also wie meinst du das mit "auf höherer Ebene abstrahieren"?
Wäre so ein eigener StateTracker denn auch eine fatale bzw. falsche Denkweise?
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

15.09.2011, 23:08

Versucht nicht, einfach eine Schicht auf OpenGL draufzusetzen, die nichts andres tut, als alles, was OpenGL kann, direkt wieder zu exposen. Sein wir mal ehrlich, was genau würde das bringen? Überleg dir, was deine Anwendung tun will und bau dir eine Abstraktionsschicht, die die Sprache deiner Anwendung spricht. Wenn es ein Tetris-Spiel ist, dann bau einen Renderer, der Blöcke zeichnen kann. Wie der Renderer intern funktioniert, ob das OpenGL oder D3D oder ein handoptimierter Softwarerenderer ist, welche Textur wann gesetzt werden muss, in welchem VBO die Blöcke liegen, etc. interessiert die Anwendung nicht. Dein Tetris will Blöcke zeichnen.

Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

8

15.09.2011, 23:13

Hmm, ich wollte mir damit eig. ein universelles kleines Framework auf Basis von OpenGL bauen, das ich flexibel in verschiedenen Projekten wiederverwenden bzw. darauf aufbauen kann.
Deswegen die Klasse für Texturen. Das ist dann wohl nicht so ohne weiteres möglich?
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

15.09.2011, 23:21

Nicht in üblicher objektorientierter Form. Man kann sich natürlich ein paar schöne RAII Klassen, generische Utilities etc. bauen. Aber eine OOP-Style Texture-Klasse mit Methoden zu den entsprechenden gl* Funktionen ist nicht so ohne weiteres möglich. Zumindest meiner Erfahrung nach. Wenn du eine Lösung findest, lass es mich wissen ;)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (15.09.2011, 23:34)


Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

10

15.09.2011, 23:36

Klar, höchst wahrscheinlich das der Newbie den alten Sack schlägt :D
Danke für dien Info jedenfalls. :)
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Werbeanzeige

Ähnliche Themen