DGL https://delphigl.com/forum/ |
|
Performanceprobleme https://delphigl.com/forum/viewtopic.php?f=20&t=4343 |
Seite 1 von 1 |
Autor: | La Boda [ Di Jul 12, 2005 16:51 ] |
Betreff des Beitrags: | Performanceprobleme |
Um gleich auf den Punkt zu kommen: Ich programmiere grad ein bissl mit Bumpmapping per GLSL rum und versuch, sowohl optisch als auch performancebezogen zu optimieren. Dabei ist mir etwas sehr merkwürdiges aufgefallen, das ich mir nicht erklären kann. Es handelt sich um folgende Zeilen (teilweise Pseudocode) im Fragmentshader: Zitat: uniform bool UseSpecular; //Diese Variable wird von Delphi aus beschrieben, im vorliegenden Fall IMMER TRUE!
main { if (UseSpecular == true) { Berechnungen_mit_Specularlighting; } if (UseSpecular != true) // oder einfach "else" { Berechnungen_ohne_Specularlighting; } } Wenn ich die Szene so rendere, hab ich knapp 250 fps. Ziemlich wenig, dachte ich mir, und hab ein bissl gesucht. Irgendwann hab ich dann einfach mal von der ersten if-Abfrage bis zur zweiten (eingeschlossen) ausgeklammert. Es sollte sich also nix verändern, es wird ja nur auf zwei if-Abfragen verzichtet. Aber, wie um mich zu ärgern, hab ich auf einmal 100 fps mehr (in Worten: Einhundert!). Das ist mir unbegreiflich, es werden ja nur zwei if-Abfragen gespart. Bitte klärt mich jemand auf, bzw bestätigt mich in meinem Verdacht, dass wieder mal die Treiber schuld sind! Dann trenne ich einfach in zwei Shader-Programme. Aber es geht ja auch ums Prinzip. Danke |
Autor: | LarsMiddendorf [ Di Jul 12, 2005 17:02 ] |
Betreff des Beitrags: | |
Je nach Länge des Blockes wird entweder beides ausgeführt oder ein dynamischer Sprung eingefügt, was noch schlimmer ist. Schau dir mal den generierten ARB_fp Text an (NVEmulate). Idealerweile sollte der Treiber hier zwei Shader bereithalten und je nach uniform Einstellung die richtige Version auswählen, was aber leider nicht passiert. In D3D geht das sogar mit Schleifen ab PS 2.0 . In Cg kann man Parameter als "literal" definieren, so dass der Shader bei Veränderung dieser Variable aktualisiert wird. Am besten machst du das über #define und #ifdef was leider unschön ist und verwaltest die beiden Shader selber. Erschwerend kommt die lange Kompilierungszeit der Shader hinzu, so daß man da nicht viele Kombinationen kompilieren kann. |
Autor: | La Boda [ Di Jul 12, 2005 18:45 ] |
Betreff des Beitrags: | |
Danke für die schnelle Antwort. Dann werd ich erstmal den Shader zweiteilen. Aber wie schon erwähnt, für große Anwendungen ist das natürlich kagge. Ich werd bezeiten einen Wiki-Admin sagen, dass er das in mein Tutorial integrieren soll (ich darf das ja ned ![]() |
Seite 1 von 1 | Alle Zeiten sind UTC + 1 Stunde |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |