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

Aktuelle Zeit: Di Mai 14, 2024 22:18

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



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Quickstart-Tutorial
BeitragVerfasst: Fr Feb 06, 2015 21:43 
Offline
DGL Member
Benutzeravatar

Registriert: Do Feb 05, 2015 17:32
Beiträge: 6
Wohnort: Berlin
Programmiersprache: FPC Lazarus
Hallo, OpenGLer

ich bin der Neue und habe zum Einstieg euer Quickstart-Tutorial durch gearbeitet. Hat auch mit Lazarus prima geklappt. Halt ein tolles Tutorial! Nur eins macht mich stutzig. Mit der OnIdle-Schleife habe ich auch ohne sleep-funktion nur eine Framerate von 60 bei nur 15% Prozessorlast auf meinem alten Notebook. Mit sleep(5) werdens 90 fps und die Prozessorlast sinkt. Nicht von wegen 4500 fps und 100%. Auch mit zwei rotierenden Würfeln ändert sich nichts.
Nicht, das mich das stören würde. Aber, hab ich was falsch gemacht???

Liebe Grüße sendet

Purtzel, der Graue

_________________
Finde Gelassenheit bei Dingen, die du nicht ändern kannst.
Lazarus 1.2.6 - FPC 2.6.4 - Windows Vista - Windows 7


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Quickstart-Tutorial
BeitragVerfasst: Fr Feb 06, 2015 22:14 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,

hast du den "Done" Parameter von der OnIdle-Funktion auf false gesetzt? Wenn nicht, dann kommt der Idel-Call nur ca. alle 16ms, was deinen 60fps entsprechen würde.

MfG Bergmann.

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Quickstart-Tutorial
BeitragVerfasst: Fr Feb 06, 2015 22:53 
Offline
DGL Member
Benutzeravatar

Registriert: Do Feb 05, 2015 17:32
Beiträge: 6
Wohnort: Berlin
Programmiersprache: FPC Lazarus
Hallo Bergmann,

danke für die schnelle Antwort aber Done ist False. Interressante Anmerkung: wenn ich Done auf True setze oder auskommentiere, bewegen sich meine Würfel nur, wenn ich den Mauszeiger über dem Formular bewege. Hab ich so auch noch nicht gesehen.

Noch ein paar Eckdaten: Lazarus 1.2.6, FP 2.6.2, Win Vista und Win 7

Liebe Grüße sendet

Purtzel, der Graue

_________________
Finde Gelassenheit bei Dingen, die du nicht ändern kannst.
Lazarus 1.2.6 - FPC 2.6.4 - Windows Vista - Windows 7


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Quickstart-Tutorial
BeitragVerfasst: Sa Feb 07, 2015 00:13 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,

hab mich geirrt, das Event kommt wenn done auf true gesetzt wurde nur, wenn eine neue Nachricht an das Fenster geschickt wird und nicht alle ~16ms. Wenn die Maus auf dem Fenster bewegt wird kommt da eine MouseMove Message rein, deshalb rendert er dann.

Was für ne Bildwiederholungsrate hat dein Monitor? Wenn das vSync vom Context angeschalten ist, dann blockiert SwapBuffers so lange, bis der Monitor ein neues Bild aufnehmen kann. Das könnte die 60Hz auch noch erklären. Ich hatte bis jetzt eigentlich gedacht, dass das per default immer abgeschaltet ist. Steuern kann man das mit wglSwapInterval und wglGetSwapInterval.

Eine andere Möglichkeit wäre, das deine Grafikkarte wirklich so langsam ist, das sie nur 60 Frames pro Sekunde zeichnen kann, das würed ich jetzt aber erstmal ausschließen.

MfG Bergmann.

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Quickstart-Tutorial
BeitragVerfasst: Sa Feb 07, 2015 07:46 
Offline
DGL Member
Benutzeravatar

Registriert: Do Feb 05, 2015 17:32
Beiträge: 6
Wohnort: Berlin
Programmiersprache: FPC Lazarus
Hallo Bergmann,

habe den Code auf 3 unterschiedlichen Rechnern getestet, einer davon der Spiele-PC meines Sohnes (Höllenmaschiene, was Performance angeht). Überall das gleiche Ergebnis: Framerate zwischen 59 und 61 FPS, Prozessorlast unter 10%. Ich füge hier mal meinen Code ein. Vielleicht kann einer von euch mal drüber lesen und ich habe doch einen Parameter falsch gesetzt.

Code:
  1.  
  2. unit uDGLOpenGLGrundgeruest;
  3.  
  4. {$mode delphi}{$H+}
  5.  
  6. interface
  7.  
  8. uses
  9.   Classes, SysUtils, Forms, Controls, Graphics, Dialogs, dglOpenGL, Windows;
  10.  
  11.  
  12. type
  13.  
  14.   { TForm1 }
  15.  
  16.   TForm1 = class(TForm)
  17.     procedure FormCreate(Sender: TObject);
  18.     procedure IdleHandler(Sender: TObject; var Done: Boolean);
  19.     procedure FormResize(Sender: TObject);
  20.     procedure FormDestroy(Sender: TObject);
  21.   private{ private declarations }
  22.     StartTime, TimeCount, FrameCount: Cardinal;
  23.     Frames, DrawTime:                 Cardinal;
  24.  
  25.     procedure SetupGL();
  26.     procedure Init();
  27.     procedure Render();
  28.     procedure ErrorHandler(Frames: Cardinal);
  29.   public{ public declarations }
  30.     DC: HDC;
  31.     RC: HGLRC;
  32.   end;
  33.  
  34. const
  35.   NearClipping = 1;
  36.   FarClipping  = 1000;
  37.  
  38. var
  39.   Form1: TForm1;
  40.  
  41. implementation
  42.  
  43. {$R *.lfm}
  44.  
  45. { TForm1 }
  46.  
  47. procedure TForm1.FormCreate(Sender: TObject);
  48. begin
  49.   with Form1 do
  50.   begin
  51.     Caption  := 'DGLOpenGL QuickStart-Tutorial - ';
  52.     Width    := 640;
  53.     Height   := 480;
  54.     Position := poScreenCenter;
  55.   end;
  56.  
  57.   DC := GetDC(Form1.Handle);
  58.  
  59.   if not InitOpenGL then Application.Terminate;
  60.  
  61.   RC := CreateRenderingContext(DC,
  62.                                [opDoubleBuffered],
  63.                                32,
  64.                                24,
  65.                                0,
  66.                                0,
  67.                                0,
  68.                                0);
  69.  
  70.  
  71.     ActivateRenderingContext(DC, RC);
  72.     SetupGL();
  73.     Init();
  74.     Application.OnIdle := IdleHandler;
  75. end;
  76.  
  77. procedure TForm1.SetupGL();
  78. begin
  79.   glClearColor(0.3, 0.4, 0.7, 0.0);
  80.   glEnable(GL_DEPTH_TEST);
  81.   glEnable(GL_CULL_FACE);
  82. end;
  83.  
  84. procedure TForm1.Init();
  85. begin
  86.   // für eventuelle Initialisierung globaler Variablen
  87. end;
  88.  
  89. procedure TForm1.FormResize(Sender: TObject);
  90. var
  91.   tmpBool: Boolean;
  92. begin
  93.   glViewport(0, 0, ClientWidth, ClientHeight);
  94.   glMatrixMode(GL_PROJECTION);
  95.   glLoadIdentity;
  96.   gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);
  97.  
  98.   glMatrixMode(GL_MODELVIEW);
  99.   glLoadIdentity;
  100.  
  101.   IdleHandler(Sender, tmpBool);
  102. end;
  103.  
  104. procedure TForm1.Render();
  105. begin
  106.  
  107.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  108.   glMatrixMode(GL_PROJECTION);
  109.   glLoadIdentity;
  110.   gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);
  111.  
  112.   glMatrixMode(GL_MODELVIEW);
  113.   glLoadIdentity;
  114.  
  115.   glTranslatef(0, 0, -5);
  116.  
  117.   glBegin(GL_QUADS);
  118.     glColor3f(1, 0, 0); glVertex3f(0, 0, 0);
  119.     glColor3f(0, 1, 0); glVertex3f(1, 0, 0);
  120.     glColor3f(0, 0, 1); glVertex3f(1, 1, 0);
  121.     glColor3f(1, 1, 0); glVertex3f(0, 1, 0);
  122.   glEnd;
  123.  
  124.   SwapBuffers(DC);
  125. end;
  126.  
  127.  
  128. procedure TForm1.IdleHandler(Sender: TObject; var Done: Boolean);
  129. begin
  130.  
  131.   StartTime:= GetTickCount;
  132.   Render();
  133.   DrawTime:= GetTickCount - StartTime;
  134.   Inc(TimeCount, DrawTime);
  135.   Inc(FrameCount);
  136.  
  137.   if TimeCount >= 1000 then begin
  138.     Frames:= FrameCount;
  139.     TimeCount:= TimeCount - 1000;
  140.     FrameCount:= 0;
  141.  
  142.     ErrorHandler(Frames);
  143.   end;
  144.  
  145.   //Sleep(5);
  146.  
  147.   Done := false;
  148. end;
  149.  
  150. // ErrorHandler übernimmt nicht nur die Fehlerausgabe sondern nun auch die
  151. // Ausgabe der Framerate in der Titelzeile des Formulars, dadurch entfällt
  152. // der ständige Wechsel der Anzeige
  153. procedure TForm1.ErrorHandler(Frames: Cardinal);
  154. begin
  155.   Form1.Caption := 'DGLOpenGL QuickStart-Tutorial - ' + InttoStr(Frames) + ' FPS - ' + gluErrorString(glGetError);
  156. end;
  157.  
  158. procedure TForm1.FormDestroy(Sender: TObject);
  159. begin
  160.   DeactivateRenderingContext;
  161.   DestroyRenderingContext(RC);
  162.   ReleaseDC(Handle, DC);
  163. end;
  164.  
  165. end.
  166.  


Danke im Voraus und viele Grüße sendet

Purtzel, der Graue

_________________
Finde Gelassenheit bei Dingen, die du nicht ändern kannst.
Lazarus 1.2.6 - FPC 2.6.4 - Windows Vista - Windows 7


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Quickstart-Tutorial
BeitragVerfasst: Sa Feb 07, 2015 10:18 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Vom IdleHandler würde ich für den Renderloop die Finger lassen. Besser einen eigenen Loop in z.B. einer repeat..until-Schleife laufen lassen, und dort dann bei Bedarf z.B. Application.ProcessMessages aufrufen.

Ansonsten wie Bergmann sagt auch den VSync aus. Entweder im Code oder im Treiber. Bei AMD ist der afaik per default aktiviert.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Quickstart-Tutorial
BeitragVerfasst: Sa Feb 07, 2015 11:09 
Offline
DGL Member
Benutzeravatar

Registriert: Do Feb 05, 2015 17:32
Beiträge: 6
Wohnort: Berlin
Programmiersprache: FPC Lazarus
Hallo Sascha,

vielen Dank für deine Antwort. Der Code resultiert aus dem Quickstart-Tutorial. Ich bin also ein totaler Neueinsteiger. Wenn es da noch Optimierungsmöglichkeiten über eine zusätzliche Schleife gibt, so möchte ich dich sehr, sehr, sehr herzlich bitten, mir ein wenig Code als Anschauungsbeispiel zu geben. Kannst du das für mich machen? Im übrigen bin ich erst über einen Forumsbeitrag von dir, bei dem es um das TOpenGLControl von Lazarus ging, auf die dglOpenGL.pas und DelphiGL.com aufmerksam geworden. Google sei Dank.

Vielen Dank im Voraus und herzliche Grüße sendet

Purtzel, der Graue

_________________
Finde Gelassenheit bei Dingen, die du nicht ändern kannst.
Lazarus 1.2.6 - FPC 2.6.4 - Windows Vista - Windows 7


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Quickstart-Tutorial
BeitragVerfasst: Sa Feb 07, 2015 17:05 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,

Sascha Willems hat geschrieben:
Vom IdleHandler würde ich für den Renderloop die Finger lassen.
Ich bin damit eigentlich immer ganz gut gefahren. Hat das denn irgendwelche Nachteile das im Idle zu machen? Für größere Projekte hatte ich den Context dann eh immer in nem extra Thread, sodass die GUI und das Rendern voneinander getrennt sind, aber für kleinere Sachen find ich OnIdle eig. ganz gut.

@Purtzel: Wenn die Zeitmessung genau sein soll, dann solltest du GetTickCount nur einmal aufrufen. So wie du es machst bekomsmt du nur die Zeit die deine Render-Methode benötigt. Aber der Rest (z.b. das was Lazarus außerhalb von OnIdle macht) gehört ja auch mit dazu. Und wie oben schon gesagt mit wglSwapIntervalEXT(0) das vSync explizit deaktivieren, dann kannst du sichergehen, das es aus ist.

MfG Bergmann

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Quickstart-Tutorial
BeitragVerfasst: Sa Feb 07, 2015 21:57 
Offline
DGL Member
Benutzeravatar

Registriert: Do Feb 05, 2015 17:32
Beiträge: 6
Wohnort: Berlin
Programmiersprache: FPC Lazarus
Hut ab, Jungs!

Nachdem ich wglSwapIntervalEXT(0) in meine FromCreate eingebaut habe (ich hoffe, das ist die richtige Stelle), geht nun voll die Post ab. Bis zu 4000 FPS aber trotzdem unter 50% Prozessorlast. Die Frage ist nun: will ich das überhaupt? Wenn ich versuche, das Tempo mit einer Delay-procedure
Code:
  1.  
  2. procedure TForm1.Delay(const Milliseconds: DWord);
  3. var
  4.   FirstTickCount: DWord;
  5. begin
  6.   FirstTickCount := GetTickCount;
  7.   while ((GetTickCount - FirstTickCount) < Milliseconds) do
  8.   begin
  9.     Application.ProcessMessages;
  10.     Sleep(0);
  11.   end;
  12. end;
  13.  

mit der Übergabe von nur einer Millisekunde wieder auszubremsen, kann ich meine rotierenden Würfel zwar wieder sehen, aber die 1000 Millisekunden
Code:
  1.  
  2. if TimeCount >= 1000 then begin
  3.     Frames:= FrameCount;
  4.     TimeCount:= TimeCount - 1000;
  5.     FrameCount:= 0;
  6.  
  7.     // Aufruf von ErrorHandler mit Übergabe der Framerate
  8.     ErrorHandler(Frames);
  9.   end;
  10.  

die im OnIdleHandler zur Anzeige der FPS in der Titelzeile des Formulars benötigt werden, werden offensichtlich nicht mehr erreicht, denn es werden keine FPS mehr angezeigt.

Gibt es eine Methode die Frames nun auf stabile 60 FPS zu reduzieren, so das mein Programm auf jedem Rechner gleich schnell läuft? Etwas in der Art wurde im Quickstart-Tutorial angedeutet:

Framezahl steuerbar: bei Timer: ja. bei OnIdle: bedingt (/umständlich)

Muss ich den Vsync beim beenden des Programms mit wglSwapIntervalEXT(1) wieder einschalten?

Fragen über Fragen!

Für Eure Mühe danke ich im Voraus und sende Grüße

Purtzel, der Graue

_________________
Finde Gelassenheit bei Dingen, die du nicht ändern kannst.
Lazarus 1.2.6 - FPC 2.6.4 - Windows Vista - Windows 7


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Quickstart-Tutorial
BeitragVerfasst: So Feb 08, 2015 02:38 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,

mit wglSwapInterval steuerst du das vSync des aktuell aktivierten Contexts. Heißt du musst es am Ende nicht wieder anschalten, weil der Context da ja eh freigegeben wird.
Die 50% CPU-Last kommen vlt. vom Dual-Core Prozessor? Es kann ja nur ein Kern (bzw. ein Thread) mit 100% laufen, heißt die gesamte CPU hat eine Last von 100% / 2 = 50%.
Wenn du eine konstante Bildrate haben willst, dann lass vSync aktiviert. Dann rendert dein Programm genau in der Bildrate, die für den Monitor sinnvoll ist.
Wozu willst du konstante Bildraten haben? Wenn du das für die Bewegung der Objekte benötigst, dann solltest du dir mal Timebased Movement ansehen. Das ist heutzutage eigentlich Gang und Gebe und garantiert, das die Animationen auf jedem PC gleich schnell laufen, auch wenn diese unterschiedliche Bildraten schaffen. In dem Artikel ist auch nocheinmal die genaue Berechnung der Zeit beschrieben (wie ich das oben schon erwähnt hatte).

MfG Bergmann.

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Quickstart-Tutorial
BeitragVerfasst: So Feb 08, 2015 13:39 
Offline
DGL Member
Benutzeravatar

Registriert: Do Feb 05, 2015 17:32
Beiträge: 6
Wohnort: Berlin
Programmiersprache: FPC Lazarus
Hallo Bergmann, hallo Sascha,

erst noch einmal herzlichen Dank für die Hilfestellung. Da habt ihr mir eine ganze Menge Gehirnfutter serviert und das muss nun erst einmal verdaut werden. Tolle Anregungen zum optimieren und coden. Von einem konkreten Projekt bin ich zwar noch Lichtjahre entfernt aber OpenGL macht Spaß und jede Reise beginnt mit einem ersten Schritt. Ich hoffe, ihr und das gesammte Forum werdet mir weiterhin zur Seite stehen bei Problemen, die sicherlich noch kommen werden und vielleicht kann ich mich später auch einmal als Helfer in der Not einbringen. Jedenfalls eine tolle erste Forumserfahrung hier bei euch. Das habe ich woanders leider auch schon anders erlebt.

Liebe Grüße sendet euch

Purtzel, der Graue

_________________
Finde Gelassenheit bei Dingen, die du nicht ändern kannst.
Lazarus 1.2.6 - FPC 2.6.4 - Windows Vista - Windows 7


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


Wer ist online?

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