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

Aktuelle Zeit: Mi Jul 16, 2025 10:28

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



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mi Mär 08, 2006 11:04 
Offline
DGL Member

Registriert: Di Feb 07, 2006 20:22
Beiträge: 27
Hi all,

ein paar Freunde und ich wollen für den Infounterricht eine kleine Grafikdemo schreiben (niedriged Niveau) und kommen damit bisher gut voran. Einige Szenen sind schon eingebaut, zeitlich ist alles getimet. Nun ist einer auf die Idee gekommen, dass wir doch einen FPS counter einfügen könnten. Da das Programm im Vollbild läuft, war meine Idee die FPS als Schrift in obere rechte Ecke des Bildschirms zu setzen. Mithilfe einiger Templates bastelten wir uns dann was zusammen, was auch funktionert; für ungefähr 0,5 Sekunden, bevor der Counter verschwindet und die Primitve anfangen zu flackern. Ich poste hier mal ein paar Teile des Quellcodes, sollte der volle zur Problemlösung gebraucht werden, kann ich ihn auch posten:

Code:
  1.  
  2. var
  3.   Form1: TForm1;
  4.   DC, RC :HDC;
  5.   PosX1,PosX2,Rot1,Faktor :real;
  6.   berechnungszeit :longword;
  7.   Zeitfaktor :double;
  8.   Szenen : Array[0..3, 0..1] of Integer;
  9.   StartTime,StartTime2, FontLists :cardinal;
  10.   currentScene,Frames :integer;
  11.   FPS :single;
  12.  
  13. implementation
  14.  
  15. {$R *.dfm}
  16.  
  17.  
  18. procedure TForm1.ShowText;
  19. begin
  20.    glListBase(FontLists);
  21.    glCallLists(Length(pText), GL_UNSIGNED_BYTE, Pointer(pText));
  22. end;
  23.  
  24.  
  25. procedure TForm1.ShowFPS;
  26. var Text :string;
  27. begin
  28. glpushmatrix;
  29.  glMatrixMode(GL_Projection);
  30.  glLoadidentity;
  31.  glOrtho(0,1024,768,0,-1,1);
  32.  glViewport(0, 0, ClientWidth, ClientHeight);
  33.  glLoadidentity;
  34.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  35.   glColor3f(1,1,1);
  36.   Text:=FloattoStr(FPS);
  37.   glRasterPos3f(0.5,0.8,0);
  38.   ShowText(Text);;
  39.   Swapbuffers(DC);
  40. glpopmatrix;
  41. end;
  42.  
  43. procedure TForm1.Szene1;
  44. begin
  45.    ShowFPS;
  46.    glPushmatrix;
  47.    glMatrixMode(GL_Modelview);
  48.    glLoadIdentity;
  49.    glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  50.    glTranslatef(0, 0,-6);
  51.    glBegin(GL_TRIANGLES);
  52.    glColor3f(1, 0, 0); glVertex3f(-1,-1, 0);
  53.    glColor3f(0, 0, 1); glVertex3f( 1,-1, 0);
  54.    glColor3f(0, 1, 0); glVertex3f( 0, 1, 0);
  55.    glEnd;
  56.    SwapBuffers(DC);
  57.    glpopmatrix;
  58. end;
  59.  
  60. procedure TForm1.Onidle(Sender: TObject; var Done: Boolean);
  61. const Frequenz = 1000;
  62. var aktuellezeit :longword;
  63.  begin
  64. aktuellezeit:=GetTickCount();
  65. Zeitfaktor:=(aktuelleZeit - Berechnungszeit)/Frequenz;
  66. Render;
  67. inc(Frames);
  68. Berechnungszeit:=aktuellezeit;
  69. Done:=false;
  70. //zuständig fürs timen der Szenen:
  71. if (aktuellezeit - StartTime)>= Szenen[CurrentScene,1] then
  72.   begin
  73.   inc(Currentscene);
  74.   StartTime:=GetTickCount;
  75.   end;
  76. // der FPS-Counter
  77. if GetTickCount - StartTime2 >= 100 then
  78.  begin
  79.  FPS       := Frames/(GetTickCount-StartTime2)*1000;
  80.  Frames    := 0;
  81.  StartTime2 := GetTickCount
  82.  end;
  83. end;
  84.  


irgendwelche Ideen?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 08, 2006 11:17 
Offline
Fels i.d. Brandung
Benutzeravatar

Registriert: Sa Mai 04, 2002 19:48
Beiträge: 3830
Wohnort: Tespe (nahe Hamburg)
Ja. ;) Gleich beim Überfliegen. Welchen Sinn macht das Swapbuffers(DC); in der ShowFPS? Dies führt dazu, dass die OpenGL-Ausgabe erfolgt und dann später nochmals, wenn die Szene gerendert wird, jedoch ohne ein glClear zuvor, womit vermutlich das richtige angezeigt wird. Das Swapbuffers entfernen wird vermutlich dein Problem lösen.

_________________
"Light travels faster than sound. This is why some people appear bright, before you can hear them speak..."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 08, 2006 12:46 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Phobeus hat es ja schon gesagt, dass Swapbuffer ist nicht nötig, genauso wie das Gepushe.

Das es dann so aussieht:
Code:
  1. procedure TForm1.ShowFPS;
  2. var Text :string;
  3. begin
  4.  glMatrixMode(GL_Projection);
  5.  glLoadidentity;
  6.  glOrtho(0,1024,768,0,-1,1);
  7.  glViewport(0, 0, ClientWidth, ClientHeight);
  8.  glLoadidentity;
  9.  glColor3f(1,1,1);
  10.  Text:=FloattoStr(FPS);
  11.  glRasterPos3f(0.5,0.8,0);
  12.  ShowText(Text);;
  13. end;
  14.  
  15. procedure TForm1.Szene1;
  16. begin
  17.    glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  18.    ShowFPS;
  19.    glMatrixMode(GL_Modelview);
  20.    glLoadIdentity;
  21.    glTranslatef(0, 0,-6);
  22.    glBegin(GL_TRIANGLES);
  23.      glColor3f(1, 0, 0); glVertex3f(-1,-1, 0);
  24.      glColor3f(0, 0, 1); glVertex3f( 1,-1, 0);
  25.      glColor3f(0, 1, 0); glVertex3f( 0, 1, 0);
  26.    glEnd;
  27.    SwapBuffers(DC);
  28. end;


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 08, 2006 13:09 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Das ShowFPS ist in diesem Zustand im übrigen mit Vorsicht zu genießen. Egal was vorher eingestellt ist setzt die Methode stupide den OrthoModus. So wie ich es aber einschätze soll der Rest in der Perspektive sein. glViewPort muss in dem ShowFPS auch nicht aufgerufen werden.

Code:
  1. procedure TForm1.ShowFPS;
  2.   var Text :string;
  3. begin
  4.   glMatrixMode(GL_PROJECTION);
  5.   // Existierende Projektion sichern.
  6.   glPushMaxtrix;
  7.   // Neue Ansicht einstellen
  8.   glLoadIdentity;
  9.   glOrtho(0,1024,768,0,-1,1);
  10.  
  11.   glMarixMode(GL_MODELVIEW);
  12.   glLoadIdentity;
  13.  
  14.   glColor3f(1,1,1);
  15.   Text:=FloattoStr(FPS);
  16.   glRasterPos3f(0.5,0.8,0);
  17.   ShowText(Text);
  18.  
  19.   // "Alte" Projektion wieder herstellen.
  20.   glMatrixMode(GL_PROJECTION);
  21.   glPopMaxtrix;
  22. end;


Modelview muss nicht gesichert werden, da sie danach eh überschrieben wird. Sollte das Show irgenwann mal in der Mitte aufgerufen werden und die Modelview Matrix sollte dann erhalten bleiben so müsste sie auch mit gescihert werden.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 08, 2006 14:22 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Ich will ja nicht mosern, aber das kommt davon, wenn man sich das aus Templates zusammenklaubt, ohne zu wissen, was da eigentlich drin vorgeht ;)

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 08, 2006 16:16 
Offline
DGL Member

Registriert: Di Feb 07, 2006 20:22
Beiträge: 27
Okay dank Lossey Ex geht es jetzt, ich musste nur noch den Buffer vor dem aufruf von ShowFPS leeren und nicht danach. Das einzige was mich jetzt noch schafft ist die Position des Counters. Er ist in der oberen, linken ecke, allerdings wird nur ein kleiner Teil von ihn angezeigt. Als ich nun die y-Koordinate das Rasters verringern wollte, damit das ganze in bisschen nach unten rutscht, ist garnichts passiert, außer das ab dem Wert 0 der ganze Counter verschwindet.

Was mache ich falsch?

btw: @Frase: Hätte ich nicht im Template nachgeschaut hättet ihr alle wieder gesagt: "Schau doch einfach im Template nach." :P


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 08, 2006 16:39 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Die Rasterpostion ist die untere linke Ecke des Textes. Damit dein Text also richtig sichtbar ist musst du als Y mindestens die Höhe deiner Schrift angeben. Wenn der Orthomodus auch der Auflösung deines Fensters entspricht. Anderenfalls wird es ein wenig schwieriger den Text Pixelgenau zu positionieren. Aber ich denke mal für X ist 5 und für Y 20 - 23 ein guter Wert um den Text oben Links darzustellen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 08, 2006 19:49 
Offline
DGL Member

Registriert: Di Feb 07, 2006 20:22
Beiträge: 27
Alles klar, jetzt gehts!


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


Wer ist online?

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