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

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

11

15.09.2011, 23:55

Ach naja, Erfahrung ist nicht immer nur was positives. Tunnelblick und so ;)

12

16.09.2011, 00:19

Na, man kann zum Beispiel vor dem Rendern alles nach Materialien sortieren, muss dann ein Material (inlusiv Textur) nur einmal setzen und kann dann alle Objekte die dieses Material benutzen hintereinander weg zeichnen.
Insgesamt ist Performance bei 3D Anwendungen ein sehr schweres Thema, es gibt sehr viele Faktoren, und vieles was vor ein paar Jahren als allgemeine Richtlinie galt, gilt heute schon längst nicht mehr.
Auf jeden Fall ist es falsch zu sagen "glGet ist das schlimmste was es gibt, das darf ich nie benutzen", oder ähnliches. Viele Richtlinien vereinfachen komplizierte Regeln, wenn man sie aber stur und ohne Verstand anwendet, schaden sie mehr, als sie bringen.

Ein 'Wrapper' für OpenGL ist zum Beispiel OpenSceneGraph, womit ich mich zufällig momentan beschäftige. Das löst das mit dem States und Texturen setzen recht elegant (wie ich finde), aber es ist natürlich auch ein riesiges Framework. Dort kann man ein State für ein Node setzen, er wird dann aktiviert, alle Objekte gezeichnet und dann deaktiviert, wodurch man also definiert "Dieser State gilt für diesen Node und alle Child Nodes".
Lieber dumm fragen, als dumm bleiben!

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

13

16.09.2011, 00:26

Vor allem ist ein Scenegraph vielleicht für einige Aspekte des Scenemanagement von Vorteil, für andere dafür aber sehr ineffizient (Ständiges Traversieren von tiefen Baumstrukturen ist nicht gerade der Burner wenns um Performance geht). Für RAD sind solche Systeme vielleicht sehr angenehm, in ernsthaften Engines kommen aber wenn überhaupt, dann nur sehr flache Szenengraphen zum Einsatz. Schon rein prinzipiell kann es nicht die eine Datenstruktur geben, die sämtliche Probleme löst. Je nach Problem wird man auf verschiedenste Strukturen zurückgreifen. Schon in der Quake-Engine gabs verschiedenste Renderqueues, BSP Trees, PVS, ...

Ganz unabhängig davon, wie schnell glGet*() nun ist, ist der Einsatz wie im Anfangspost auf jeden Fall völliger Overkill.

Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von »dot« (16.09.2011, 00:39)


Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

14

16.09.2011, 00:39

Na im letzten Satz endlich mal Tacheles ;) Dann wird es gestrichen. Dachte nur, es wäre möglicherweise ganz klug. Versuch macht Kluch.
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

15

16.09.2011, 00:44

Um ehrlich zu sein, hab ich das noch nie profiled. Wenn man bedenkt, dass die ganzen Bind Calls beträchtlichen Overhead erzeugen können, mag es durchaus sein, dass du, im Vergleich zu ständigen Binden, damit was sparen könntest. Der Punkt ist aber: Es gibt überhaupt keinen Grund dafür, ständig zu binden. Es ist dein Code, also muss dir rein theoretisch eigentlich schon zur Compiletime bekannt sein, wann es was zu binden gibt. Daher besser einfach von Haus aus nur binden wenn nötig, anstatt irgendwelche Laufzeitmechanismen zu bauen, die das für dich entscheiden. Die Tatsache dass du ständig binden willst, ist doch nur ein Symptom davon, dass das OpenGL Objektmodell einfach nicht gut auf herkömmliche OOP Konstrukte mapped. Anstatt OpenGL in ein OO Korsett zu zwingen und die Symptome zu bekämpfen, wäre es imo besser, OpenGL einfach OpenGL sein zu lassen. Die API hat eben ihre Schwächen und für OOP ist es auf dieser Ebene evtl. sowieso zu früh.

Dieser Beitrag wurde bereits 11 mal editiert, zuletzt von »dot« (16.09.2011, 01:01)


Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

16

16.09.2011, 06:15

Schon klar, dass ich selbst wissen _sollte_ wann dies der Fall ist. Benutzt ich jedoch eine Wrapper Klasse für solche OpenGL Konstrukte kann ich das natürlich nicht in feste Muster zwingen und brauch irgendwie eine Art und Weise damit umzugehen. Ich dachte ja auch schon an einen eigenen StateTracker^^
Der Test zeigte bei mir mit diesem Abfrage-Konstrukt durchaus eine kleine Erhöhung der Framerate (um wie viel ist irrelevant, da ich nicht ausgiebig genug getestet habe um konkrete Werte zu sagen). Das ganze ist ja aber auch kaum ausgelastet und schafft bisher somit eine FPS von > 1100.
Aber ich denke es ist trotzdem eine schlechte Idee dort auf glGet* zurückzugreifen, immerhin kann es ja durchaus sein, das mal einige Dutzend Texturen vorhanden sind und keine Ahnung wie performant dann glGet* Calls sind. Werd' es als kleine Spielerei mal wirklich mit 'nem eigenen StateTracker probieren und ansonsten das Thema erstmal lassen.
Danke soweit.
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

17

16.09.2011, 10:35

Benutzt ich jedoch eine Wrapper Klasse für solche OpenGL Konstrukte kann ich das natürlich nicht in feste Muster zwingen und brauch irgendwie eine Art und Weise damit umzugehen. Ich dachte ja auch schon an einen eigenen StateTracker^^

Genau darum gehts ja. Du bräuchtest das alles ausschließlich nur damit dein Wrapper funktioniert. Imo ein ziemlich deutliches Zeichen dafür, dass ein solcher Wrapper nicht die ideale Lösung ist.

Werbeanzeige

Ähnliche Themen