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

Aktuelle Zeit: Fr Jul 11, 2025 07:29

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
BeitragVerfasst: So Nov 23, 2008 15:52 
Offline
DGL Member

Registriert: So Nov 23, 2008 13:56
Beiträge: 16
Hallo,
ich habe ursprünglich immer ziemlich VCL basiert mit Delphi geabreitet. Doch durch einige Probleme mit meinen aktuellen Betriebssystem
bin ich nun umgestiegen auf den guten Code::Blocks, programmiere in C++ und nutze zusätzlich SDL zur Oberflächenerstellung. Also
hab ich erstmal ein paar alte Projekte umgeschrieben, um mich an die Sprache zu gewöhnen. Timebased Movement sowie einen FPS
Counter hatte ich erstmal außen vor gelassen da ich größere Probleme mit Arrays, Zeigern und der Speicherverwaltung hatte.
Nun hab ich mich etwas an C++ gewöhnt und wollte erstmal wieder einen FPS Counter einbauen und habe genau damit Probleme.

Folgendermaßen hab ich es zur Zeit im Quellcode zu stehen.

Code:
  1.  
  2. Hauptschleife
  3. {
  4. ...
  5. ...
  6. Uint32 StartTime ,DrawTime;
  7. bool done = FALSE;
  8. unsigned int FPS = 0;
  9. SDL_Event ev;
  10. SDL_Surface* image;
  11. textures();
  12.  
  13.           while (!done)                                            
  14.          {
  15.               SDL_PollEvent(&ev);                                          
  16.  
  17.               if (ev.type == SDL_QUIT || ev.key.keysym.sym == SDLK_ESCAPE)
  18.               {
  19.                    done = TRUE;
  20.               }
  21.               StartTime = SDL_GetTicks();
  22.               Render();
  23.               SDL_Delay(10);                                                  
  24.               DrawTime = DrawTime + (SDL_GetTicks() - StartTime);
  25.               FPS++;
  26.               printf("Drawtime %i\n",DrawTime);
  27.               if (DrawTime >= 1000)
  28.               {
  29.                   printf("FPS:  %i\n",FPS);
  30.                   DrawTime = 0;
  31.                   FPS = 0;
  32.               }
  33.          }
  34. ...
  35. ...
  36. }


Die ganze Prozedur zur Berechnung der FPS ist von der Logik identisch mit der aus dem ersten Delphitutorial.
Das Problem ist aber, dass wenn ich StartTime und DrawTime in meiner Mainfunktion habe, das Programm
das Objekt aus der Renderfunktion nicht mehr rotiert. Komentiere ich die 2 Zeilen die SDL_GetTicks() beinhalten
wieder aus so rotiert das Objekt auch wie gewohnt. Wie gesagt bewegt sich das Objekt beim verwenden der
oberen beiden Zeilen nicht mehr, gezeichnet wird es aber dennoch.
Irgendwie kann ich mit dem Problem nichts anfangen da die beiden Werte ja nichts mit dem erstellen vom Objekt
zu tun haben. Hoffe nun das jemand von euch auch schon einmal ein ähnliches Problem hatte und eine Lösung kennt.



Danke schon mal im Voraus.


Zuletzt geändert von R2-D2 am So Nov 23, 2008 23:42, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 23, 2008 15:57 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Mir fällt verschiedenes auf.
Erstmal solltest du DrawTime initialisieren.
Dann solltest du wenn DrawTime >= 1000 ist die nicht auf 0 zurücksetzen, sondern 1000 abziehen. Sonst rechnest du ungenau.
Außerdem würde mich interessieren wieso du 10 Millis wartest?
Ich würde direkt nach dem rendern die EndTime ermitteln und dann mit den beiden Zahlen weiter rechnen.

Es gibt im Wiki auch einen Code für einen Framecounter.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 23, 2008 16:28 
Offline
DGL Member

Registriert: So Nov 23, 2008 13:56
Beiträge: 16
Danke für den Hinweis mit den -1000. Ist mir so noch nicht eingefallen, aber erscheint logisch wenn man es erstmal ließt. :lol:
Die Initialisierung zu vergessen war wieder ein Flüchtigkeitsfehler. SDL_Delay hab ich im Code um nicht permanent beim
testen den PC maximal auszulasten. Durch die 10 ms Verzögerung hab ich immer um die 100 FPS und das ist ausreichend.

Danke für den Link zum Wiki, aber das Beispiel habe ich auch schon gefunden. ^^
Mein Problem ist das Verhalten von SDL_GetTicks(). Ich kann die Variablen auch global deklarieren und direkt nach
SDL_GL_Swapbuffers() die DrawTime ermitteln. Das ändert nichts an den komischen Fehler. Ich kann StartTime auch
außerhalb der Hauptschleife initialisieren. Dann flackert das Bild wie verrückt und ist dann nach kurzer Zeit schwarz.
Will ich zum Beispiel printf("*****") anwenden um mir die Werte aus StartTime und DrawTime auszugeben bleibt der
Bildschirm generell schwarz. Beende ich dann das Programm und gucke in die ausgegebene Datei dann sehe ich aber,
dass die Werte in StartTime und DrawTime so wie die Schleife sich normal verhalten haben.




LÖSUNG

Ich habe das Problem nun durch mehrfaches auskommentieren in den Griff bekommen. Aus irgendeinen Grund verträgt sich
die stetige Abfrage der Events, nicht mit der Zeitabfrage in einer Schleife. Also hab ich das Ganze nun folgendermaßen gelöst.
Code:
  1.   Hauptfunktion
  2. ...
  3. ...      
  4.         Init_SDL();
  5.         Init_OpenGL();
  6.         textures();
  7.         bool done = FALSE;
  8.  
  9.          while (!done)                                        
  10.          {
  11.              Render();
  12.              getKeyboardInput(done);
  13.          }
  14. ...
  15. ...
  16.  

So sieht die Funktion schön klein und übersichtlich aus. StartTime wird nun am Anfang von Render ausgeführt und nachdem
am Ende SDL_GL_Swapbuffers() ausgeführt wurde wird die Zeitdifferenz dazwischen berechnet.

Code:
  1.   Renderfunktion
  2.     StartTime = SDL_GetTicks();
  3. ...
  4. ...
  5. ...
  6.     SDL_Delay(10);
  7.     DrawTime = SDL_GetTicks() - StartTime;
  8.     TimeCount = TimeCount + DrawTime;
  9.     FPS++;
  10.     if (TimeCount >= 1000)
  11.     {
  12.     printf("FPS:         %i\n",FPS);
  13.     TimeCount = TimeCount - 1000;                                  
  14.     FPS = 0;
  15.     }

Nachteil ist, dass man nur mit der verstichenen Zeit innerhalb der Renderfunktion die FPS berechnet. Das bedeutet dann auch,
dass SDL_Delay() innerhalb der Renderfunktion benutzt werden muss, falls man dem Rechner zwischendurch eine Pause gönnen
möchte und dennoch die Verzögerung in die Zeitberechnung eingehen soll. Vorteil ist, dass man DrawTime gleich weiter verwenden
kann für das Timebased Movement. Das ist nicht gerade die beste Variante und sie wird sich sicherlich noch ändern, aber sie funktioniert. ^^

Wenn jemand dennoch weiß, warum der Fehler auftritt wenn man den Code
aus dem ersten Beitrag benutzt, wäre ich dankbar für eine Antwort.


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


Wer ist online?

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