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++):
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?
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:
glScalef(2,2,2);
glTranslate(1,2,3);
glRotatef( 30,1,1,0);
ZEICHNEN_ETWAS();
glRotatef(-30,1,1,0);
glTranslatef(-1,-2,-3);
glScalef(0.5,0.5,0.5);
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
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
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.
Mitglieder in diesem Forum: 0 Mitglieder und 4 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.