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

Aktuelle Zeit: Fr Jul 18, 2025 05:16

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



Ein neues Thema erstellen Auf das Thema antworten  [ 28 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Performance Frage
BeitragVerfasst: Fr Apr 14, 2006 16:02 
Offline
DGL Member

Registriert: Mo Jan 09, 2006 17:31
Beiträge: 37
hallo Leute! Ich progge grad an nem Shoot em Up und habs jetzt geschafft schon einige Funktionen in meine C++ / SDL / OpenGL Engine einzubauen. Nun bin ich seit kurzem dabei nen Level-Loader hinzuzufügen inkl. Darstellung (scrollender Hintergrund). Bisher war ich mit der Geschw. ja ganz zufrieden , hatte für mein Menü ca. 400 windowed und im Fullscreen 450 FPS. Mein ganzes Game hat 800x600 als Auflösung. Jetzt hab ich aber eben das Level zuig hinzugefügt und sobald das alles gezeichnet wird sinkt die FPS auf 80 - 100 obwohl alles in einer OpenGL-List gezeichnet wird, sind diese Werte normal?

Das Level wird nur gezeichnet, wenn es innerhalb der Window-Koordinaten ist und setzt sich aus 32x32 BMP's zusammen.

---
Mir ist grad aufgefallen, dass ich GL_LINEAR aktiviert hatte, habs auf GL_NEAREST umgeschrieben. Komm jetzt also auf ca. 140 - 160 FPS, das gefällt mir schon viel besser. Würd grad gern nochmal hören, dass das ein akzeptabler Wert ist. Smile


Zuletzt geändert von Dark_Ruler am Fr Apr 14, 2006 19:09, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Apr 14, 2006 16:33 
Offline
DGL Member

Registriert: Mi Dez 15, 2004 20:36
Beiträge: 454
Wohnort: Wien, Österreich
Etwas von deinem Code zu sehen wäre nicht schlecht, man könnte möglicherweise etwas genauer dazu sagen ;).

_________________
"Meine Mutter sagt : 'Dumm ist der, der Dummes tut'." - Forrest Gump


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Apr 14, 2006 19:00 
Offline
DGL Member

Registriert: Mo Jan 09, 2006 17:31
Beiträge: 37
Ist schon recht komplex und lang, ich wollt nur mal wissen ob das halbwegs normale Werte sind, hatte nämlich schon mehr FPS erwartet.

Hier die Passage zum Level zeichnen (werde while noch in for umwandeln):
Code:
  1. void DrawMap() {
  2.     i = 0;
  3.     j = 0;
  4.     while_bool = true;
  5.     while (while_bool) {
  6.         if (Level1[i][j].Visible) {
  7.                 glLoadIdentity();
  8.                 glTranslatef(Level1[i][j].pos_x, j * 32 + 50, 0);
  9.                     glColor4f(1.0f,0.0f,0.0f, 1.0f);
  10.                     glCallList(GL_List_Map[Level1[i][j].IMG_nr]); }
  11.             j++;
  12.             if (j == 16) { i++; j = 0; }
  13.             if (i == 20) { while_bool = false; }
  14.     } }


Und hier meine GL_List (für den Test hab ich jetzt nur die eine Textur)
Code:
  1.     GL_List_Map[0] = glGenLists(1);
  2.     glNewList(GL_List_Map[0], GL_COMPILE);
  3.         glBindTexture(GL_TEXTURE_2D, Texture[1].Tex);
  4.             glBegin(GL_QUADS);
  5.                 glTexCoord2f(0.0f, 0.0f); glVertex2f(0.0f, 0.0f);
  6.                 glTexCoord2f(1.0f, 0.0f); glVertex2f(32, 0.0f);
  7.                 glTexCoord2f(1.0f, 1.0f); glVertex2f(32, 32);
  8.                 glTexCoord2f(0.0f, 1.0f); glVertex2f(0.0f, 32);
  9.             glEnd();
  10.         glLoadIdentity();
  11.     glEndList();
  12.  


DrawMap wird so oft aufgerufen wie möglich, UpdateMap wo dann alles um 1 pixel nach links verschoben wird max. 60 mal / s (auch hier wird die while durch for ersetzt werden)
Code:
  1. void UpdateMap(void) {
  2.     i = 0;
  3.     j = 0;
  4.     while_bool = true;
  5.     while (while_bool) {
  6.         if (Level1[i][j].Visible) {
  7.             Level1[i][j].pos_x -= 1;
  8.             if (Level1[i][j].pos_x <= -32) { Level1[i][j].Visible = false; }
  9.         }
  10.         j++;
  11.         if (j == 16) { i++; j = 0; }
  12.         if (i == 22) { while_bool = false; }
  13.     }
  14. }



Das wären ein paar Auszüge


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Apr 14, 2006 19:07 
Offline
DGL Member

Registriert: Mo Jan 09, 2006 17:31
Beiträge: 37
Mir ist grad aufgefallen, dass ich GL_LINEAR aktiviert hatte, habs auf GL_NEAREST umgeschrieben. Komm jetzt also auf ca. 140 - 160 FPS, das gefällt mir schon viel besser. Würd grad gern nochmal hören, dass das ein akzeptabler Wert ist. :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Apr 14, 2006 19:23 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Alles was über 30 Frames ist gilt als flüssig. Wenn du mehr als 60 hast wird keiner einen Unterschied zu 300 Frames feststellen können.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Apr 15, 2006 07:49 
Offline
DGL Member

Registriert: Mo Jan 20, 2003 20:10
Beiträge: 424
Wohnort: nähe Starnberg
Du verwendest hier sehr häufig LoadIdentity, in der DisplayList am Ende und in der Routine zum zeichnen vor dem Aufruf der DisplayList, eines von beiden ist überflüssig. Das dürfte zwar kaum was ausmachen.

Du bindest in der DisplayListe ständig eine Textur. Es ist besser, vor dem Zeichen nach den Texturen zu sortieren und dann entsprechend vor der ersten Verwendung einer neuen Texture zu binden und dann die DisplayListen aufzurufen. Du könntest in Level[i][j] zusätzlich die Textur speichern, in einer ersten Schleife alle zu zeichnenden Tiles bestimmen, diese in einem zweiten Array speichern und dieses Array nach den Texturen sortieren. Damit würdest Du nur noch eine einzige DisplayList brauchen und nicht für jede Textur eine.

Gruß
Thomas

_________________
http://www.seban.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Apr 15, 2006 10:11 
Offline
DGL Member

Registriert: Mo Jan 09, 2006 17:31
Beiträge: 37
KidPaddle hat geschrieben:
Du verwendest hier sehr häufig LoadIdentity, in der DisplayList am Ende und in der Routine zum zeichnen vor dem Aufruf der DisplayList, eines von beiden ist überflüssig. Das dürfte zwar kaum was ausmachen.

Du bindest in der DisplayListe ständig eine Textur. Es ist besser, vor dem Zeichen nach den Texturen zu sortieren und dann entsprechend vor der ersten Verwendung einer neuen Texture zu binden und dann die DisplayListen aufzurufen. Du könntest in Level[i][j] zusätzlich die Textur speichern, in einer ersten Schleife alle zu zeichnenden Tiles bestimmen, diese in einem zweiten Array speichern und dieses Array nach den Texturen sortieren. Damit würdest Du nur noch eine einzige DisplayList brauchen und nicht für jede Textur eine.

Gruß
Thomas


Danke, das dürfte was bringen!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Apr 15, 2006 12:53 
Offline
DGL Member

Registriert: Mi Dez 15, 2004 20:36
Beiträge: 454
Wohnort: Wien, Österreich
KidPaddle hat geschrieben:
Du bindest in der DisplayListe ständig eine Textur.
Das ist sowieso ein Fehler. In einer DL kann man lediglich nur die Texturkoordinaten speichern.

_________________
"Meine Mutter sagt : 'Dumm ist der, der Dummes tut'." - Forrest Gump


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Apr 15, 2006 15:34 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Sicher sniper? Wäre mir neu, dass man in einer Displaylist keine Texturen binden dürfte. Bei VBOs stimmt's. Mag sein, dass das bei Displaylists auch so ist, aber ich wäre überrascht, sollte es so sein ;)

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Apr 15, 2006 16:05 
Offline
DGL Member

Registriert: Mo Jan 09, 2006 17:31
Beiträge: 37
Also funktionieren tut es auch in ner Display List ob man es "darf" ist ne andere Frage :wink:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Apr 15, 2006 17:51 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
No Texturen sind OK. Siehe glNewList

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 16, 2006 12:56 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Mir ist grad aufgefallen, dass du wohl anscheinend kein Timebased Movement verwendest. Solltest du schleunigst nachholen ;)

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 16, 2006 14:38 
Offline
DGL Member

Registriert: Mo Jan 09, 2006 17:31
Beiträge: 37
Frase hat geschrieben:
Mir ist grad aufgefallen, dass du wohl anscheinend kein Timebased Movement verwendest. Solltest du schleunigst nachholen ;)


Jop, hab bisher in Updates / Sekunde (~60) und die Zeichenroutinen unterteilt. d.h. Update nur zu gefixten Zeiten und Zeichnen sooft wie möglich, funtzt allerdings noch nicht ganz perfekt. Werd mir mal den Artikel durchlesen und ausprobieren was besser funtzt!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 16, 2006 19:02 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Das kann ich dir jetzt schon sagen ;) Timebased Movement ist immer vorzuziehen, wenn es nicht um Energieschonende Anwendungen geht. Solltest du planen, das Ganze auf einem Notebook einzusetzen, ist einem reinen Timebased Movement ein Timebased Movement kombiniert mit sleep vorzuziehen ;) Dein Akku wird es dir danken ;)

Aber ansonsten ganz klar: Timebased Movement.

Ok, es gibt noch eine weitere Ausnahme. In dem Fall, dass deine Anwendung so konzipiert ist, dass sie neben anderen OpenGL-Progs laufen soll, wäre es evtl. besser, auf eine OnPaint-Methode zurückzugreifen. Dass du also nur dann zeichnest, wenn es sein muss. Das ist die Akkuschonendste und netteste Variante. Nett hier im Sinne von Ressourcenschonend, so dass für andere Anwendungen noch Zeit übrig bleibt.

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 16, 2006 21:14 
Offline
DGL Member

Registriert: Mo Jan 09, 2006 17:31
Beiträge: 37
Also bin jetzt beim implementieren, soweit ich das jetzt verstanden habe geht das so (die Kommentare im Wiki sind nicht ganz verständlich an welcher Position der Code in nem App hingehört, deswegen hab ich mich eher der Theorie (im Bomberman Tut) als dem Code gewidmet):

1. Zeit vor Rendern nehmen
2. Zeit nach Rendern nehmen
3. Daraus Zeitfaktor berechnen
und mit diesem alle Bewegungen multiplizieren

(Game-Schleife) {
Code:
  1.  
  2.         ..
  3.         BerechnungsZeit = SDL_GetTicks(); // SDL_GetTicks -> vergangene ms seit SDL Initialisierung
  4.         if (!GAME_PAUSED) { UpdateScene(); }
  5.         DrawScene();
  6.         SDL_Delay(5);
  7.         AktuelleZeit=SDL_GetTicks();
  8.         Zeitfaktor = (AktuelleZeit - BerechnungsZeit) / 1000.0f;
  9.         ..
  10.  

Swap Buffers }
und wieder loopen

Wäre das jetzt korrekt (hab derzeit keine anderen Rechner zum testen)?

EDIT: Hab das prob dass bei Frameraten über 200 bei Zeitfaktor 0 herauskommt und alles stehenbleibt ..


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 28 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 26 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.010s | 16 Queries | GZIP : On ]