Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 12:40

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: glPushMatrix/glPopMatrix sehr teuer!
BeitragVerfasst: Mi Jan 07, 2009 15:21 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

das is diesmal nicht direkt eine frage, sondern eher eine feststellung.. :)
Ich habe heute die ganze nacht dannach gesucht warum bei mir eine Scene mit 30.000 Triangles nur mit 20fps rendern wohingegen eine Scene mit 200.000 Triangles mit über 120fps läuft..

Die Hauptunterschiede:

200.000 Tri Scene:
- Wenig Objekte, aber sehr HighPoly
- Wenige Texturen
- Viele dynamische Lichter (7 Stück)
- Animationen (Bone, Vertex etc)

30.000 Tri Scene:
- Sehr sehr viele low poly Objekte (ca. 4000 objekte)
- Sehr viele Texturen
- Nur ein dynamisches licht
- Keine animationen

Zuerst habe ich es auf die extrem vielen Objekte geschoben, weil jedes objekt eine eigenes VBO hatte.. das also kurzerhand umgebastelt so das sie sich alle ein VBO teilen und nurnoch glDrawArrays aufgerufen wird mit entsprechenden bereichen.

Das hat aber genau 0 fps gebracht.. womit schonmal klar wäre, viele kleine VBOs oder ein großes macht nicht wirklich einen unterschied ;)

Als nächstes dachte ich "Okay... evtl sind es die vielen Texturwechsel"..also einfach alle texturen deaktiviert.. etwa 2fpx schneller geworden.. das war es also auchnicht.

Dann hab ich noch ein paar dinge hier und da ausprobiert und war schon am verzweifeln.. zwischenzeitig hab ich mich dann wieder um komplett andere probleme gekümmert um den kopf davon frei zu bekommen. Und jetzt eben ganz zum schluss kam ich auf die idee "Moment mal.. jedes Objekt hat ja ein Transform, welches auch wenn es nicht transformiert ist eine matrix multipliziert", also dachte ich das glMultMatrix macht es langsam.. auskommentiert.. 0fps mehr bekommen :(

Und dann hab ich da um das glMultMatrix mein glPushMatrix / glPopMatrix block entdeckt und dachte.. "Ob es das ist..?!". Auskommentiert und siehe da: Von 20fps hochgeschossen auf ein paar hundert! :)

Ich war immer der Meinung das glPushMatrix und glPopMatrix eigentlich recht günstig sind, aber bei 4000x fachem aufruf pro frame ist es da wohl auch zuende mit günstig sein ;)

Warum ich das schreibe? Nur um anderen eine solche suche zu ersparen und zu erwähnen das man mit den beiden funktionen nicht so um sich werfen sollte wie ich es gerne tu :)

Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 07, 2009 19:16 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Das klingt interessant für mich. Meine JOGL_GUI an der ich arbeite benutzt das sehr oft (Einfach um die abhängigen Transformationen auf den Formularen abzubilden). Ich denke ich werde da ebenfalls mal rumprobieren.

Das es so bremst liegt vermutlich an ... hmmm... Der OpenGL Treiber speichert die Matrizen doch lokal im Arbeitspeicher, oder? Der schickt die doch nicht auf die GraKa um sie beim Pop wiederzuholen, oder?

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 07, 2009 19:22 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Flash hat geschrieben:
Das es so bremst liegt vermutlich an ... hmmm... Der OpenGL Treiber speichert die Matrizen doch lokal im Arbeitspeicher, oder? Der schickt die doch nicht auf die GraKa um sie beim Pop wiederzuholen, oder?


Ich nehm an der fragt beim Push'en die aktuelle matrix ab und setzt sie beim Pop'en wieder.. aber warum das so lange dauert versteh ich eigentlich auch nicht.. evtl liegt es aber auch nur am Mac-Treiber, kann ich aber erst übermorgen testen wenn ich wieder zuhause bin :)

Aya~

PS: In meiner UI verwende ich es auch excessiv, die alternative wäre eigentlich ja dann nur alles via translate hinschieben und dannach zurückschieben, oder?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 07, 2009 19:54 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 27, 2005 12:44
Beiträge: 393
Wohnort: Berlin
Programmiersprache: Java, C++, Groovy
Hallo,

Zitat:
Ich war immer der Meinung das glPushMatrix und glPopMatrix eigentlich recht günstig sind, aber bei 4000x fachem aufruf pro frame ist es da wohl auch zuende mit günstig sein Wink


naja bei 20 fps sind das auch 4000 x 20 x 16 = 1280000 Werte pro Sekunde, die irgendwo im Speicher verschoben werden müssen, das hat glaub ich schon Auswirkungen auf die Performance ;)

Viele Grüße
dj3hut1

_________________
Wenn Gauß heute lebte, wäre er ein Hacker.
Peter Sarnak, Professor an der Princeton University


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 07, 2009 20:24 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Aya hat geschrieben:
In meiner UI verwende ich es auch excessiv, die alternative wäre eigentlich ja dann nur alles via translate hinschieben und dannach zurückschieben, oder?

Was anderes Performantes viele mir auch nicht ein.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 08, 2009 00:41 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Aya schrieb:
Zitat:
Und dann hab ich da um das glMultMatrix mein glPushMatrix / glPopMatrix block entdeckt und dachte.. "Ob es das ist..?!". Auskommentiert und siehe da: Von 20fps hochgeschossen auf ein paar hundert!


Danke für die Info bezüglich der kleinen VBOs, das hilft mir viel.

Übrigens kann man das glPush/glPop auch so vermeiden: man bastelt sich seine eigene ModelviewProjection-Matrix und diese wird einfach mit der Matrix des zu zeichnenden Objekts multipliziert und erst dann an OpenGL übergeben. Das heißt, jedes Objekt bringt seine eigene fertige Matrix mit (auch jedes Joint). Sowohl Modelview- als auch Projection-Matrix sind beide dann nur mehr eine Einheitsmatrix. Ob das aber mehr Performance bringt, kann ich jetzt nicht sagen, ist nur so eine Idee. Es sind dann halt mehr Matrix-Multiplikationen in Hauptspeicher durchzuführen.

Man darf ja auch nicht vergessen, dass die üblichen Grafikkarten auf schnelle Spiele zugeschnitten werden, und ob die Pushen und Poppen....?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 08, 2009 09:14 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Flash hat geschrieben:
Aya hat geschrieben:
In meiner UI verwende ich es auch excessiv, die alternative wäre eigentlich ja dann nur alles via translate hinschieben und dannach zurückschieben, oder?

Was anderes Performantes viele mir auch nicht ein.

Bei meinen Fonts hatte ich das ursprünglich auch so. Und zwar die Laufweite von den Buchstaben (Position des nächsten Buchstabens) habe ich mit Translate übertragen. Allerdings ist das unpraktisch für den Entwickler, da die OpenGL verändert wurde, und verhindert die spätere Benutzung von VBOs. Also habe ich es so umgestellt, dass ich die Position auf interne Integer packe und beim Zeichnen die Position der Quads absolut berechne und so zeichne. Und in dem einen Beispiel was in einer Schleife zeichnet und die fps ausgibt erhalte ich Werte die ca 20% höher sind. Was aber auch vollkommen logisch ist. Denn die Werte müssen nicht über den Stack übergeben werden und dann müssen die Werte nur simpelst addiert werden. Die Stelle wo das alles berechnet wird liegt auch viel näher beisammenm, wodurch der Treiber/Pipeline nicht bemüht werden müssen.

In meiner ollen gui (die ich eingestellt habe) habe ich es so gelöst, dass ich für jede komponente absolute Koordinaten berechnet habe. Und zwar nur dann, wenn sich die Position eines Elementes verändert hat. Dann natürlich auch nur sie und die Kindkomponenten. Die absolute Position ist auch nur intern von interesse. Sonst wird immer alles relativ angegeben. Beim Zeichnen kann man sich dann vollkommen auf die berechneten Werte stützen und muss nichts weiter machen. In einem Benchmark erreiche ich damit bei meiner Radeon 3850 knapp 10k fps und 99% GPU Auslastung. Ich kann ja auch alles direkt zeichnen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 08, 2009 12:52 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ich hab bei mir mal nachgeguckt und habe festgestellt, dass ich Push/PopMatrix doch nicht so oft benutze.
Beim Eintritt in den GUI Code, sichere ich alle 3 Matrizen, und ansonsten nur an 1 oder 2 Stellen wo eine manuelle Berechnung deutlich unübersichtlich wäre.
Die Positionierung der Componenten erfolgt bereits durch iterierende glTranslates.
Das meine GUI noch nicht so performant ist, liegt vermutlich an anderen Punkten.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 08, 2009 13:49 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Hmm... Das ist interessant. Ich werd dann auch mal gehen und nach meiner GUI schauen... Aya, du hast das Weltbild der OpenGL-GUI-Entwickler zerstört ;)

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 08, 2009 17:59 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Ich hab das mal mit meinem (einfachen) Partikelsystem getestet. Aber bei mir ist Pop und Push ein bischen schneller, als wenn ich die Skalierung und Verschiedung rückgängig mache (820 gegen 720 FPS).
Und ich denke umso mehr die Matrix verändert wird, desto besser wird Pop/Push. Weil man die ganzen Operationen quasi nochmal machen muss, aber die Matrix auf den Stack hauen eine konstante Zeit benötigt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 08, 2009 18:33 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Wisst ihr an was ich dabei denken muss?

Den DGL Benchmark. Vielleicht schreibt mal jemand ein Anwendungsskelett, wo man ohne größere Probleme einfache Testfälle reincoden kann. Der Benchmark kam ja nicht vorran, weil die herangehensweise Diskutiert wurde. Wenn jemand einfach irgendwas abliefert, ist das schonmal besser, als drüber zu reden. ;)

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 16 Queries | GZIP : On ]