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

Aktuelle Zeit: Fr Jul 18, 2025 08:12

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



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Performance viel zu niedrig
BeitragVerfasst: Mo Jun 08, 2009 15:06 
Offline
DGL Member

Registriert: Mo Jun 08, 2009 14:53
Beiträge: 4
Hallo Leute,

ich habe eine kleine OGL Anwendung geschrieben, welche Messdaten grafisch darstellt. Dabei gibt es für jeden Punkt(X,Y) einen Messwert, welcher die Tiefe(Z) darstellt. Es ensteht somit also ein großes 3D Objekt, welches mit einer 1D Textur überzogen wird. Das ganze funktioniert auch einwandfrei, allerdings ist die Perfomance absolut bescheiden (ca. 5 fps ), sobald ich das Objekt drehe oder bewege.
Das Objekt selbst besteht aus ca. 350.000 Dreiecken.

Der Code dazu findet sich hier:
http://nopaste.info/d9889b9055.html

Wie kann ich das ganze nun performanter machen?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 08, 2009 15:45 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Also du verwendest eine Displaylist, das ist eigentlich ganz ok so, dürfte in diesem Fall genauso schnell wie ein VBO sein. Ich sehe jetzt keine offensichtlichen Fehler die sich auf die Performance auswirken würden. Oder rufst du vielleicht InitializeGL() bzw. make3DCScan() jedes Frame auf?

Ich vermute jetzt mal deine Hardware ist einfach zu lahm, 350k Dreiecke sind nicht wenig.

BTW: Im Wiki gibt es einen Performance-Artikel, wobei du wie gesagt keine offensichtlichen Fehler machst.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 08, 2009 15:50 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Autsch....mach das mal aus:
Code:
  1. glEnable (GL_POINT_SMOOTH);    // Antialiasing für Punkte einschalten
  2. glEnable (GL_LINE_SMOOTH);    // Antialiasing für Linien einschalten


Das ist extrem lahm und sollte nicht verwendet werden. Siehe auch OpenGL_Smooth.

Wahrscheinlich ist es schneller das Bild in doppelter Auflösung in eine Textur zu rendern und dann runter zu skalieren.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jun 09, 2009 08:11 
Offline
DGL Member

Registriert: Mo Jun 08, 2009 14:53
Beiträge: 4
Coolcat hat geschrieben:
Autsch....mach das mal aus:
Code:
  1. glEnable (GL_POINT_SMOOTH);    // Antialiasing für Punkte einschalten
  2. glEnable (GL_LINE_SMOOTH);    // Antialiasing für Linien einschalten


Das ist extrem lahm und sollte nicht verwendet werden. Siehe auch OpenGL_Smooth.

also das Antialiasing hab ich ausgeschaltet, an der Perfomance hat sich jedoch leider überhaupt nichts geändert. Man merkt keinerlei Unterschied.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jun 09, 2009 09:33 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Mich würde aber auch mal interessieren was du für eine Grafikkarte hast. 350.000k Dreiecke sind vielleicht nicht so wahnsinnig viel aber schon recht ordentlich. Dazu brauchst du schon ein bisschen was anständiges um das richtig performant zu bekommen.

Je nachdem was du für eine Grafikkarte hast (speziell etwas ältere ATIs) kann die Textur auch ein Problem sein. Da solltest du darauf achten, dass die Texturgröße eine Potenz von 2 ist. In deinem Code konnte ich leider nicht so recht erkennen wie groß dein dimX ist. Was eventuell auch bremsend sein könnte sind zu kleine Objekte. So etwas könntest du mit VBOs kompensieren. Dann auch das komplette Objekt aus Dreiecken und nicht aus Strips aufbauen. Also ein VBO mit Indexbuffer. Bei einer Displayliste bist du dem ausgeliefert was der Treiber machen will. Mit einem VBO liegt die Kontrolle dann in deiner Hand.

Wobei ich aber denke, dass das eigentlich Problem eher woanders liegt. Denn du zeichnest das Fenster nur neu, wenn du eine WM_CHAR Message bekommst. Bedenke bitte, dass dies abhängig von der im System eingestellten Tastenwiederholung ist. Selbst, wenn dein System da mehr Leisten kann wird es immer nur maximal in diesem Raster sein. Und was das angeht kannst du auch mal in einen Texteditor gehen und die Tasten dauerhaft drücken. So wahnsinnig viel mehr als 5-7 Tasten sollten da pro Sekunde auch nicht entstehen.

Was das angeht solltest die die generelle Zeichenweise ändern. Ich würde dort wohl eher WM_KEYDOWN und WM_KEYUP vorziehen. Diese Messages werden aufgerufen sobald eine Taste gedrückt oder losgelassen wird. Du musst dann bei dir in einer Boolvariable (pro Tastencode) vermerken ob diese Taste gedrückt ist. Da mehrere Tasten gleichzeitig gedrückt werden können genügt eine Statusvariable nicht. Sollte einer deiner Tasten gedrückt sein so musst du einen Renderloop anwerfen. Ein Timer mit dem Intervall 0-1ms oder so ist auch okay. Wenn dann keine Tasten mehr gedrückt werden solltest du den Timer wieder stoppen und nur bei Bedarf zeichnen. Nur dann wirst du die Tastenverzögerung überwinden können.

Als Erweiterung dazu wirst du wohl auch noch Timebased Movement benötigen. Also du musst dann in Abhängig von der Geschwindigkeit des System größer oder kleinere Rotationen wählen. Denn wenn du auf einem System bist was 200 fps schafft wirds viel viel schneller sein als auf einem System was wirklich nur 10 fps schafft. Das musst du im Programm kompensieren. Als Erweiterung zur Erweiterung könnte es auch sinnvoll sein, dann die maximale fps auf 30 zu begrenzen. Mehr sind für flüssige Animationen nicht nötig. Aber den letzten Abschnitt können wir später noch mal näher besprechen. Bzw solltest du auch in Betracht ziehen die Rotationen in Variablen abzulegen und beim Zeichnen zu setzen. Wer weiß was du noch alles machen willst. Und da würde ich mich nicht darauf verlassen, dass die Modelview Matrix immer die Rotation deines Objektes enthält.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jun 09, 2009 14:08 
Offline
DGL Member

Registriert: Mo Jun 08, 2009 14:53
Beiträge: 4
Lossy eX hat geschrieben:
Mich würde aber auch mal interessieren was du für eine Grafikkarte hast. 350.000k Dreiecke sind vielleicht nicht so wahnsinnig viel aber schon recht ordentlich. Dazu brauchst du schon ein bisschen was anständiges um das richtig performant zu bekommen.

Je nachdem was du für eine Grafikkarte hast (speziell etwas ältere ATIs) kann die Textur auch ein Problem sein. Da solltest du darauf achten, dass die Texturgröße eine Potenz von 2 ist.


Bingo! Problem gelöst.

Nach ewigem hin und her habe ich festgestellt, dass es am Texturvektor lag. Der hatte eine Größe von 864. Geändert auf 1024 und schwups es läuft sauschnell.
Graka benutze ich eine Ati Radeon x1300Pro. Vorher wurde als alles per Software gerendert.

Vielen Dank für eure Hilfen.


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


Wer ist online?

Mitglieder in diesem Forum: Bing [Bot] und 2 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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.013s | 16 Queries | GZIP : On ]