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

Aktuelle Zeit: Fr Jul 18, 2025 15:07

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



Ein neues Thema erstellen Auf das Thema antworten  [ 29 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: FPS Zahl limitieren.
BeitragVerfasst: Fr Jul 15, 2005 23:02 
Offline
DGL Member

Registriert: Mi Dez 15, 2004 20:36
Beiträge: 454
Wohnort: Wien, Österreich
Wie mach man das am besten ?
Bisher:
Code:
  1. procedure TGameEngine.UpdateTime();
  2. begin
  3.   QueryPerformanceCounter(F_CurrentTime );
  4.   TIME_STEP := (F_CurrentTime - F_FrameTime) / F_Freq ;
  5.   F_FrameTime := F_CurrentTime;
  6. end;
  7.  
  8. procedure TGameEngine.LimitFPS();
  9. begin
  10.   if(FFPSLimit>30)and(TIME_STEP<(1/FFPSLimit))then
  11.     Sleep(DWORD(Round((1/FFPSLimit - TIME_STEP)*1000)));
  12. end;
  13.  
  14. procedure TGameEngine.Render();
  15. begin
  16.   UpdateTime();
  17.  // ..........
  18.   inc(FPSCount); // fps anzahl
  19.   LimitFPS();
  20. end;
Geht aber nicht ganz gut so. :roll: Wenn ich FFPSLimit auf ~50(~100) setze, dann schafft die schleiffe ~100(~150) durchläufe. Was mache ich falsch.

_________________
"Meine Mutter sagt : 'Dumm ist der, der Dummes tut'." - Forrest Gump


Zuletzt geändert von sniper am Fr Jul 15, 2005 23:24, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 15, 2005 23:11 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Wozu soll das denn gut sein?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 15, 2005 23:19 
Offline
DGL Member

Registriert: Mi Dez 15, 2004 20:36
Beiträge: 454
Wohnort: Wien, Österreich
Zitat:
Wozu soll das denn gut sein?
:roll: Was für eine Frage ist das ? Ganz fehl am Platz. Aber trotzdem, ich wollte es als eine Option in meinem Programm anbieten.

_________________
"Meine Mutter sagt : 'Dumm ist der, der Dummes tut'." - Forrest Gump


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jul 16, 2005 12:11 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 13, 2004 11:00
Beiträge: 229
Wohnort: Steinhude
wenn ich mich jetz richtig erinnere war die auflösung von sleep nicht so dolle, vll. könnte das daran liegen (auf anhieb fallen mir jedenfalls keine fehler auf, häng aber auch grad innen seilen ;))


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jul 16, 2005 12:13 
Offline
DGL Member

Registriert: Mi Dez 15, 2004 20:36
Beiträge: 454
Wohnort: Wien, Österreich
Zitat:
wenn ich mich jetz richtig erinnere war die auflösung von sleep nicht so dolle, vll. könnte das daran liegen (auf anhieb fallen mir jedenfalls keine fehler auf, häng aber auch grad innen seilen
Das habe ich auch befürchet... :roll:

_________________
"Meine Mutter sagt : 'Dumm ist der, der Dummes tut'." - Forrest Gump


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jul 16, 2005 12:33 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Auf sulaco gibt es doch 2 Beispiele dafür.
Hast du die schon angeschaut?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jul 16, 2005 12:54 
Offline
DGL Member

Registriert: Do Apr 08, 2004 16:55
Beiträge: 516
[OT]
Spontan fällt mir da fps_max 100 ein :D
[/OT]

Guck mal in verschiedenen Delphi Foren, ga gibts genug Threads!

_________________
Shareholder und Leitender Entwickler bei Pipedream-Games.

Zitat: Siehst du diesen Park da unten? Jeden Tag lernen sich darin Menschen kennen und verlassen einander. Und du hast dein ganzes Leben Zeit darin zu gehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jul 16, 2005 20:08 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

also auch wenn ich den sinn von soetwas ebenfalls nicht ganz nachvollziehen kann... einen vorschlag will ich trotzdem machen :)

Wenn du das ganze via Sleep machst, läufst du große gefahr das es ganz stark ruckelt... weil, wenn eine GraKa z.B. normal 100 FPS schafft, du sie aber auf 30FPS limitierst, würde das bedeuten das du in den ersten 30 huntertstel Sekunden die Scene 30x zeichnest und dann für 0.7 Sekunden ein standbild hast...

viel eher würde ich das ganze via QueryPerformanceCounter machen.

Du willst 30FPS maximal... also die QueryPerformance-Frequency / 30.0.. und die scene immer nur dann zeichnen wenn die QPC-Timer-Zeit wieder eine 30igstel Sekunde weiter ist.

Damit bekommst du auf die sekunde dann 30 frames gleichmäßig verteilt hin, und es würde auch funktionieren wenn eine GraKa nur 10fps schafft, statt der 30..

Au'revoir,
Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jul 16, 2005 21:18 
Offline
DGL Member

Registriert: Mi Dez 15, 2004 20:36
Beiträge: 454
Wohnort: Wien, Österreich
@Aya: Du hast recht.
Aber mit Sleep wollte ich auch erreichen dass CPU Auslastung runterfällt...

_________________
"Meine Mutter sagt : 'Dumm ist der, der Dummes tut'." - Forrest Gump


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jul 16, 2005 22:58 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also ich denke mal Notebookesitzer werden dir solche eine Option danken. Abgesehen davon finde ich es zum Beispiel auch lächerlich, wenn zum Beispiel ein Bildschirmschoner zwar den Bildschirm mit einem dunklem Bild "schont" aber dafür die CPU dauerhaft belastet. Außerdem ist es egal ob ich 50 oder 100 Bilder in der Sekunde sehe. Einen großen Unterschied macht es nicht. Dafür ist alleine das menschliche Auge zu träge.

Also ich hatte so etwas auch schon mal mit einem Sleep gemacht und wenn du das zusaätzlich zum Sleep noch den PerformanceCounter zu rate ziehst sollte das eigentlich gehen. Wie ich das genau gemacht hatte weiß ich nicht hundertprozentig. Ich meine ich hätte ausgerechnet alle 20ms Sekunden ein Bild und 12 hat das Bild gedauert. Dann hatte ich halt 8 gewartet. Evtl hatte ich die Zeit des Renderns und des Wartens noch in das nächste Bild mit einfließen lassen. Also Er hatte aber insgesammt 1 ms länger gebraucht. Also beim nächsten mal wartet er dann 1ms weniger. etc.

Evtl könntest du ja auch nen Timer nehmen. Die Zeiten sind zwar nicht so genau. Aber das könnte man evtl durch ein wenig Zeitmessung ausgleichen. Wenn die Leistung nicht ausreicht, dann wartet er ja auch brav. Und so hast du kein direktes Sleep und die Anwendung ist noch voll Funktionsfähig.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jul 17, 2005 08:56 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 14, 2004 18:56
Beiträge: 804
Wohnort: GER/OBB/TÖL-WOR/Greiling
wenn man in einer OnIdle-Schleife immer wieder den performancecounter überprüft, zieht dass doch auch CPU-Auslastung, oder?
Denn es ist ja egal, ob die CPU 100 mal berechnet oder ob sie 1000 mal nur prüft, ob sie etwas zu berechnen hat.

Wäre da nicht ein Timer besser?

viel bringt - v.a. für einen Bildschirmschoner - auch wenn man im OnIdle das Done auf true setzt. somit wird die szene nur neugezeicdhnet, wenn sich wirklich etwas ändert. da reicht dann eigentlich auch schon ein OnTimer als Starthilfe, wenn alle Berechnungen, die am Bild etwas ändern, erst im OnIdle selbst durchgeführt werden.

_________________
Bild

"User Error. Replace User and hit Continue."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jul 17, 2005 09:48 
Offline
DGL Member

Registriert: Mo Apr 05, 2004 19:51
Beiträge: 105
Ganz simpel gefragt: Warum nicht einfach auf den VSync warten? Das begrenzt die Framerate auf Notebooks automatisch auf 60 und bei Röhrenmonitoren üblicherweise auf maximal 100... Schlecht ist das keinesfalls (im Zweifel sieht alles sogar deutlich flüssiger aus, zumindest bei CRTs) - und die CPU wird auch nicht zu 100% ausgelastet.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jul 17, 2005 10:58 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Feb 24, 2003 18:19
Beiträge: 165
Wohnort: Cologne
das Problem mit (Standard)Timern ist, das viel zu ungenau sind - ganz grausam ist das AFAIK sogar noch bei Win9X ;) Und VSync macht die Sache auch nicht besser, da man so nur sehr begrenzt die Framerate beeinflussen kann - und dem Benutzer einfach die Bildwiederholungsrate verstellen ist für meinen geschmack doch sehr unfreundlich. Ich denke Aya's Vorschlag ist schon der beste Weg - ich denke es geht hier nicht (nur) um die Auslastungsverhinderung der CPU sondern auch der GPU - jeder Notebookbesitzer mit temperaturabhängigem aktiven Kühler wird es dir danken ;)

_________________
www.omfg.biz - aktuelles projekt


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jul 17, 2005 12:03 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Die Idee mit VSync dir Framerate zu begrenzen st ja durchaus auch gar nicht so doof. Hat aber einne Hacken. Beim Warten auf das Syncsignal verbrät er selber 100% CPU Leistung, da das Signal nur für den Bruchteil einer ms gesendet wird. Hat also im Endeffekt nur den Vorteil, dass die Frameraten begrenz werden. Und man kann den außerdem noch fest im Treiber auf immer aus stellen. Somit hat das dann kaum nährwert.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jul 17, 2005 13:44 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 14, 2004 18:56
Beiträge: 804
Wohnort: GER/OBB/TÖL-WOR/Greiling
genau das meine ich: sowohl die lösung mit queryperformancecounter als auch mit vsync hat die eigenart, die CPU-Auslastung trotzdem auf 100 zu bringen.

Gibt es nicht bei den Jedi's einen präzisen Timer? Denn das erscheint mir als einzige Möglichkeit, und auch der Standardtimer wird wohl bei 50 fps(=intervall von 20) noch genau genug sein.

eigentlich geht es ja nicht darum, die framerate auf 5 stellen hinter dem dezimalpunkt genau festzulegen, sondern darum, die CPU zu entlasten.

_________________
Bild

"User Error. Replace User and hit Continue."


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 29 Beiträge ]  Gehe zu Seite 1, 2  Nächste
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.010s | 15 Queries | GZIP : On ]