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

Aktuelle Zeit: Mi Jul 09, 2025 14:31

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



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Framebuffer funktioniert nicht
BeitragVerfasst: So Dez 03, 2006 15:34 
Offline
DGL Member

Registriert: Di Jan 24, 2006 18:46
Beiträge: 97
Hallo,

um die CPU zu schonen brauche ich einen Framebuffer. Nun ja, das Problem an meinem Source ist, dass er immer doppelt so shcnell läuft, wie er sollte. also statt 100FPS 200 FPS und statt 20FPS 40FPS.

Sieht einr von euch meinen Fehler?

Code:
  1. procedure TDrawClass._Run;
  2. var
  3.   t, nt: Cardinal;
  4.   s, cnt: Cardinal;
  5.   rfps: Extended;
  6. begin
  7.   InterlockedExchange(Integer(_iRun), 1);
  8.   cnt:=0;
  9.   if _CreateGL then
  10.   begin
  11.     InterlockedExchange(Integer(_iRun), 1);
  12.     s:=GetTickCount;
  13.     t:=GetTickCount;
  14.     while not _wStop do
  15.     begin
  16.       inc(cnt);
  17.       if _wResize then _Resize;
  18.  
  19.       glClear(GL_DEPTH_BUFFER_BIT or GL_COLOR_BUFFER_BIT);
  20.       Draw;
  21.       SwapBuffers(_DC);
  22.       nt:=GetTickCount;
  23.       if nt-t<_mFPS then sleep(_mFPS-(nt-t)); //Framepuffer
  24.       t:=nt;
  25.     end;
  26.     t:=GetTickCount;
  27.     rfps:=cnt*1000/(t-s);
  28.     t:=round(rfps)+1; //nur damit Delphi rfps nicht rauskürzt....
  29.     _DestroyGL;
  30.   end;
  31.   InterlockedExchange(Integer(_iRun), 0);
  32. end;


Wobei _mFPS ie Intervalle sind, also bei 100 FPS 10ms und bei 20 FPS 50ms.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 03, 2006 16:49 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jun 20, 2003 13:59
Beiträge: 134
hi
Framebuffer? hier http://wiki.delphigl.com/index.php/Framebuffer

und naja jetzt mal ohne deinen code großartig anzusehen
warum nicht einfach _mFPS:=_mFPS*2; wenn es immer doppelt so schnell läuft?

ach ja und vieleicht beim nächstenmal ein paar mehr kommentare, weil das ist so doch recht unübersichtlich. :wink:

_________________
ghost-site.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 03, 2006 16:57 
Offline
DGL Member

Registriert: Di Jan 24, 2006 18:46
Beiträge: 97
Framebuffer ist vlt. die falsche Formulierung, denn ich will nicht die Frames buffern, sondern die Zeit, wann ein Frame gezeichnet wird... .

@ *2: Das ist ja auch nicht das gelbe vom Ei. Bei meinen Messungen waren es immer doppelt soviel, kann aber sein, dass es wo anders ein anderes Verhältnis ist. Vor allem da ich mir das Phanömen nicht erklären kann :(.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 03, 2006 17:19 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jun 20, 2003 13:59
Beiträge: 134
ah man vorstellungsvermögen is zu mir zurück gekehrt.
du solltest vieleicht am ende der schleife statt t:=nt; lieber t:=gettickcount; machen.
also ich bin jetz ein paar durchläufe lang durchgegangen und bin jetzt der meinung das das der fehler sein könnte, ich bin mir nicht sicher aber du kannst es ja mal probieren.

_________________
ghost-site.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 03, 2006 17:39 
Offline
DGL Member

Registriert: Di Jan 24, 2006 18:46
Beiträge: 97
Jupp, hast recht. Dann funzt es. Den Denkfehler habe ich auch gefunden. Und zwar müsste ich eigentlich t:=t+_mFPS; statt t:=nt;, da nt ja noch die Zeit vorm Sleep beinhaltet. Das komische ist nur, dass die Sourceänderung nichts bringt (wenn ich GetTickCount "rausoptimiere", da sich dort "Rundungsfehler" einschleichen):

Code:
  1.       nt:=GetTickCount;
  2.       if nt-t<_mFPS then
  3.       begin
  4.         sleep(_mFPS-(nt-t)); //Framepuffer
  5.         t:=t+_mFPS;
  6.       end else t:=nt;


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 03, 2006 19:32 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jun 20, 2003 13:59
Beiträge: 134
hmm heißt das es geht jetz oder es geht nicht?

PS: du magst es umständlich oder? weil mit t:=gettickcount hättest du den selben effekt möcht ich mal meinen. :wink:

_________________
ghost-site.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 03, 2006 19:38 
Offline
DGL Member

Registriert: Di Jan 24, 2006 18:46
Beiträge: 97
PhoenixGL hat geschrieben:
hmm heißt das es geht jetz oder es geht nicht?

Wenn ich t:=GetTickCount mache: ja. Aber bei der Variante die ich danach gepostet habe doch nicht ;).

PhoenixGL hat geschrieben:
PS: du magst es umständlich oder? weil mit t:=gettickcount hättest du den selben effekt möcht ich mal meinen. :wink:

Ne hat sein Grund warum ich GetTickCount da nicht direkt nehmen will, denn ggf. sind es dann nicht mehr 10ms (bei 100FPS), sondern 11ms, da sleep doch eine gewisse Ungenauigkeit besitzt. Und um die Ungenauigkeit wegzubekommen, wollte ich das wegmachen ;).


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


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.011s | 15 Queries | GZIP : On ]