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

Aktuelle Zeit: Fr Jul 18, 2025 08:16

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



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: glPush/glPop umgehen?
BeitragVerfasst: So Sep 06, 2009 13:54 
Offline
DGL Member

Registriert: Sa Dez 30, 2006 17:01
Beiträge: 22
Wohnort: NRW/Fröndenberg
Hi!

Ich möchte die Performance meines Programmes (welches zur Animationszwecken OpenGL verwendet) verbessern. Über den Bildschirm bewegen sich verschiedene Objekte, die alle Unterklassen der Klasse "GraphicObject" sind. Die Unterklassen implementieren dann einfach eine "draw()" Funktion, die das Zeichnen des einzelnen Objektes übernimmt. Es kommt zwar nicht viel OpenGL in diesem Projekt vor, jedoch konnte ich einen großen Performance-Verlust auf OpenGL schieben, nämlich der sehr häufige Aufruf von glPush/glPopMatrix. Der "böse" Teil des codes sieht wie folgt aus(ist C++):

Code:
  1. DrawScene() {
  2.     //...
  3.     //OpenGL Standardeinstellungen setzen
  4.     glClearColor(255, 255, 255, 0);
  5.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  6.  
  7.     glMatrixMode(GL_PROJECTION);
  8.     glLoadIdentity();
  9.     glViewport(0,0,GetCanvasWidth(),GetCanvasHeight());
  10.     glOrtho(0,GetCanvasWidth(),0,GetCanvasHeight(),0,1); //Bin nur in 2D
  11.     glMatrixMode(GL_MODELVIEW);
  12.     glLoadIdentity();
  13.  
  14.     for (std::list<Rest>::const_iterator tRest = rest.begin(); tRest != rest.end(); ++tRest) {
  15.         glPushMatrix();
  16.         tRest->Draw();
  17.         glPopMatrix();
  18.     }
  19.  
  20.     for (std::list<CircleGL2D>::const_iterator tTarget = targets.begin(); tTarget != targets.end(); ++tTarget) {
  21.         glPushMatrix();
  22.         tTarget->Draw();
  23.         glPopMatrix();
  24.     }
  25.  
  26.     for (std::list<CircleGL2D>::const_iterator tEnemy = enemies.begin(); tEnemy != enemies.end(); ++tEnemy) {
  27.         glPushMatrix();
  28.         tEnemy->Draw();
  29.         glPopMatrix();
  30.     }
  31.  
  32.     glFlush();
  33. }
  34.  
  35. //Hier mal eine Draw-Funktion:
  36. void CircleGL2D::Draw() const {
  37.     double size = GetSize();
  38.     double xKoord = GetPositionVektor().GetX();
  39.     double yKoord = GetPositionVektor().GetY();
  40.     double angle = atan2(GetDirectionVektor().GetY(),GetDirectionVektor().GetX())*180/M_PI;
  41.  
  42.     //Farbe, Position setzen. Nach Winkel drehen und Größe ändern
  43.     glColor3d(GetColor().red, GetColor().green, GetColor().blue);
  44.     glTranslated(xKoord, yKoord, 0);
  45.     glRotated(angle, 0,0,1);
  46.     glScaled(size,size,size);
  47.  
  48.     glBegin(GL_POLYGON);
  49.         double k = 0;
  50.         for(int i = 0; i <= 300; i++)
  51.         {
  52.             glVertex2d(cos(k)*1,sin(k)*1);
  53.             k = k + (2*M_PI/300);
  54.         }
  55.     glEnd();
  56. }
  57.  


Ich möchte mir das Hinzufügen von neuen Objekten (z.B. ein Viereck oder komplexere Dinge) so einfach wie möglich lassen, indem die Draw-Funktionen so unabhängig wie möglich sind. Da die Objekte auch z.B. in verschiedenen größen vorhanden sein können (z.B. ein Kreis mit Radius = 10, einer mit Radius = 5) muss ich quasi die Matrix immer für jedes Objekt neu ausrichten/ändern.
Gibt es da eine andere Methode oder muss ich quasi alle Objekte die z.B. eine gleiche Größe haben aufeinmalzeichnen? Wie sähe dass dann mit der Animation aus?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Sep 06, 2009 15:52 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 20, 2005 13:18
Beiträge: 1054
Wohnort: Dresden
Programmiersprache: C, C++, Pascal, OPL
Wenn die Matrix immer wieder von "Null" aus verändert wird, kannst du sie mit glLoadIdentity(); einfach fix resetten.

Eine andere Möglichkeit glPush und glPop zu umgehen ist, dass man gemacht Anpassungen an der Matrix nachher in umgekehrter Reihenfolge mit ihrem reziproken bzw. negativen Wert widerholt. Beispiel:

Code:
  1.  
  2. glScalef(2,2,2);
  3. glTranslate(1,2,3);
  4. glRotatef( 30,1,1,0);
  5. ZEICHNEN_ETWAS();
  6. glRotatef(-30,1,1,0);
  7. glTranslatef(-1,-2,-3);
  8. glScalef(0.5,0.5,0.5);
  9.  

Die Matrix und vor und nach dem Code identisch.
Wenn man nur wenig Änderungen an der Matrix durchführt, KANN das schneller sein.

LG Ziz

_________________
Denn wer nur schweigt, weil er Konflikte scheut, der macht Sachen, die er hinterher bereut.
Und das ist verkehrt, denn es ist nicht so schwer, jeden Tag zu tun als ob's der letzte wär’.
Und du schaust mich an und fragst ob ich das kann.
Und ich denk, ich werd' mich ändern irgendwann.

_________________Farin Urlaub - Bewegungslos


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Sep 06, 2009 16:14 
Offline
DGL Member

Registriert: Sa Dez 30, 2006 17:01
Beiträge: 22
Wohnort: NRW/Fröndenberg
Hey, das war das was ich suchte! :) Hätte ich eigentlich auch selber drauf kommen können, naja hab lange nix mehr mit OpenGL gemacht. Also Danke!
Alle Änderungen rückwärts zu machen hatte ich auch schon überlegt, nur war ich mir da Performance-technisch auch nicht so sicher. Wie wird sowas denn bei "großen" Projekten, also z.B. Spiele wo es um jeden Frame geht gehandhabt?

By the Way: Hier gibt C++-Tags im Editor? Ist das dann [c++][/c++] oder [cpp][/cpp] oder was ganz anders?[/code]

Edit: Okay hat sich von selber beantwortet mit den Tags :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Sep 06, 2009 16:28 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Wie wird sowas denn bei "großen" Projekten, also z.B. Spiele wo es um jeden Frame geht gehandhabt?

Üblicherweise verwendet man seine eigenen Mathe-Klassen. Dann hat man die volle Kontrolle und kann auch Dinge wie Quaternionen verwenden. Die eigene Matrix übergibt man dann direkt mit glMultMatrix bzw. glLoadMatrix an OpenGL.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Sep 06, 2009 16:35 
Offline
DGL Member

Registriert: Sa Dez 30, 2006 17:01
Beiträge: 22
Wohnort: NRW/Fröndenberg
Ahh okay, das macht irgendwo auch Sinn. Danke!


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 16 Queries | GZIP : On ]