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

Aktuelle Zeit: Sa Jul 05, 2025 09:11

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



Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Render abgehackt
BeitragVerfasst: So Okt 05, 2008 22:08 
Offline
DGL Member

Registriert: Fr Dez 28, 2007 20:24
Beiträge: 62
Wohnort: Berlin
Ich benutze folgenden Code:
Code:
  1.  
  2. unit OpenGlRender;
  3.  
  4. interface
  5. uses dglopengl,
  6.   windows,
  7.   classes,
  8.   sysutils,
  9.   ExtCtrls,
  10.   forms;
  11. type
  12.   TOGLRender = class
  13.   private
  14.     procedure Render(Sender: Tobject; var done: boolean);
  15.   var
  16.     DC                        : HDC;              //Handle auf Zeichenfläche
  17.     RC                        : HDC;              //Rendering Context
  18.     Client                    : TPanel;
  19.     FPS                       : Integer;
  20.     TimeDif                   : Integer;
  21.     FrameCount                : Integer;
  22.    
  23.     public
  24.    constructor Create(Panel: TPanel);
  25.    destructor Destroy;
  26.  
  27.   end;
  28. implementation
  29. uses mainform;
  30.  
  31. constructor TOGLRender.Create(Panel: TPanel);
  32. begin
  33.   Client := Panel;
  34.   DC := GetDC(Client.Handle);
  35.   if not InitOpenGL then Application.Terminate;
  36.   RC := CreateRenderingContext(DC,
  37.     [opDoubleBuffered],
  38.     32,
  39.     24,
  40.     0, 0, 0,
  41.     0);
  42.   FPS := 0;
  43.   TimeDif := 0;
  44.   FrameCount := 0;
  45.   ActivateRenderingContext(DC, RC);
  46.   glClearColor(0, 0, 0, 1.0);                     //Hintergrundfarbe: Hier ein leichtes Blau
  47.   //glEnable(GL_DEPTH_TEST);                      //Tiefentest aktivieren
  48.   //glEnable(GL_CULL_FACE);
  49.   Application.OnIdle := Render;
  50. end;
  51.  
  52. procedure TOGLRender.Render(Sender: Tobject; var done: boolean);
  53. begin
  54.   FPS := GetTickCount;
  55.   //sleep(1);
  56.   glMatrixMode(GL_PROJECTION);
  57.   glLoadIdentity;
  58.   glOrtho(0, Client.ClientWidth, 0, Client.ClientHeight, 0, 128);
  59.   glBegin(GL_QUADS);
  60.     glColor3f(1, 0, 0);
  61.     glVertex3f(0, 0, 0);
  62.     glColor3f(0, 1, 0);
  63.     glVertex3f(100, 0, 0);
  64.     glColor3f(0, 0, 1);
  65.     glVertex3f(Timedif, Timedif, 0);
  66.     glColor3f(1, 1, 0);
  67.     glVertex3f(0, 100, 0);
  68.   glEnd;
  69.  
  70.  
  71.   SwapBuffers(DC);
  72.   inc(FrameCount,1);
  73.   TimeDif := Timedif + GetTickCount - FPS;
  74.   if TimeDif >= 1000 then
  75.   begin
  76.    FPS := FrameCount;
  77.    Dec(Timedif,1000);
  78.    FrameCount := 0;
  79.    Form1.Caption:= Inttostr(FPS);
  80.   end;
  81.   done := False;
  82. end;
  83.  
  84. destructor TOGLRender.Destroy;
  85. begin
  86.   DeactivateRenderingContext;
  87.   DestroyRenderingContext(RC);
  88.   ReleaseDC(GetDesktopWindow, DC);
  89. end;
  90. end.
  91.  


Im Create wird halt nen Panel übergeben auf dem dann gerendert wird.
Clearbuffer hagbe ich rausgenommen um einen "übermal" effekt zu erzielen. Jedenfalls, wenn ich das Programm dann starte, das heisst nen einfaches Form mit nem Panel, rendert er erst flüssig nach 3 Sekunden vorher sehr abgehackt.

Wodran liegt das?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 05, 2008 22:21 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
Es ist empfehlenswert nur einmal pro frame die Zeit abzufragen. Sonst rechnest du die Zeit zwischen zwei onidle aufrufen nicht ein. Es gibt hier im Forum viele Threads zu Timebased movement mit günstigeren Lösungen für die Zeitmessung.
Außerdem ist deine Verwendung der fps variablen ein echter codinghorror.
Bild

_________________
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 05, 2008 22:27 
Offline
DGL Member

Registriert: Fr Dez 28, 2007 20:24
Beiträge: 62
Wohnort: Berlin
Das is nur nen Versuch weil ich nich soviele Variablen Deklarieren wollte. Selbst wenn ich es ordentlich mache (Copy und Paste aus Tutorial 1) ändert es nichts -.-

Ok nachdem ich Dec und Inc jeweils durch x:= x +/- a geändert hab geht es...


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 8 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 16 Queries | GZIP : On ]