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:
procedure TDrawClass._Run;
var
t, nt:Cardinal;
s, cnt:Cardinal;
rfps:Extended;
begin
InterlockedExchange(Integer(_iRun),1);
cnt:=0;
if _CreateGL then
begin
InterlockedExchange(Integer(_iRun),1);
s:=GetTickCount;
t:=GetTickCount;
whilenot _wStop do
begin
inc(cnt);
if _wResize then _Resize;
glClear(GL_DEPTH_BUFFER_BIT or GL_COLOR_BUFFER_BIT);
Draw;
SwapBuffers(_DC);
nt:=GetTickCount;
if nt-t<_mFPS thensleep(_mFPS-(nt-t));//Framepuffer
t:=nt;
end;
t:=GetTickCount;
rfps:=cnt*1000/(t-s);
t:=round(rfps)+1;//nur damit Delphi rfps nicht rauskürzt....
_DestroyGL;
end;
InterlockedExchange(Integer(_iRun),0);
end;
Wobei _mFPS ie Intervalle sind, also bei 100 FPS 10ms und bei 20 FPS 50ms.
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 .
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.
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):
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.
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 .
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.