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

Aktuelle Zeit: Do Jul 10, 2025 15:45

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



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
BeitragVerfasst: So Jul 24, 2011 16:33 
Offline
DGL Member

Registriert: So Jul 24, 2011 15:40
Beiträge: 15
Hallo Leute,

ich versuche gerade verzweifelt eine Frameratebegrenzung auf max. XX fps in mein Spiel einzubauen. Ich möchte also keinen Time-Based- sondern einen Frame-Based-Movement-Ansatz fahren. Da mein Spiel kaum Anforderungen an die CPU stellt und ich selbst mit meinem schrottigen Laptop noch 500 FPS erreiche wäre das denke ich vertretbar :) Hierzu habe ich folgenden Codeschnipsel bei euch im Wiki gefunden (http://wiki.delphigl.com/index.php/Fram ... mentierung):

Code:
  1. var
  2.   FMaximumFrameRate: double;
  3.   FLastSleep: double = 0;
  4.  
  5. procedure LimitFrameRate(atd: double); //"atd" ist die Zeitdifferenz zwischen zwei Frames - inklusive der "Sleeptime"
  6. var
  7.   sleeptime: Double;
  8. begin
  9.   sleeptime := 1000 / FMaximumFrameRate - (atd - FLastSleep);
  10.   if sleeptime > 0 then
  11.   begin
  12.     Sleep(trunc(sleeptime));
  13.     FLastSleep := sleeptime;
  14.   end else
  15.     FLastSleep := 0;
  16. end;



... werde jedoch leider nicht wirklich schlau daraus :/ Besonders der Part mit "atd" leuchtet mir noch nicht ein. Ich verstehe nicht ganz welchen Wert ich beim Aufruf der Prozedur übergeben muss, bzw. wie sich dieser errechnet - auch weiß ich nicht wo genau ich diese Prozedur aufrufen muss. Vielleicht verstehe ich es auch einfach nur total falsch :}

Wäre toll, wenn sich jemand erbarmt mir zu helfen :)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jul 24, 2011 19:15 
Offline
DGL Member

Registriert: Do Jun 28, 2007 17:58
Beiträge: 193
Programmiersprache: Pascal, C
Du hast irgendwo deine Haupt-Programmschleife. Dort fügst du sowas ein wie
Code:
  1.  
  2. var lasttc: int64;
  3.  
  4. procedure Schleife;
  5. var
  6.   tneu: int64;
  7.   tdelta : int64;
  8. begin
  9.   tneu := GetTickCount();
  10.   tdelta := tneu - lasttc;
  11.   lasttc := tneu;
  12.   LimitFrameRate(tdelta / 1000);
  13.  
  14.   // Zeichne
  15. end;
  16.  

_________________
http://audorra.sourceforge.net//http://andorra.sourceforge.net


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jul 24, 2011 23:28 
Offline
DGL Member

Registriert: So Jul 24, 2011 15:40
Beiträge: 15
Hallo und danke erstmal... für die Zeitmessung wollte ich den QueryPerformanceCounter, nicht GetTickcount verwenden.. könntest du das nochmal unter Verwendung des selbigen beschreiben?

Code:
  1.  
  2. procedure TMainform.loop(Sender: TObject; var Done: Boolean);
  3. begin
  4.   QueryPerformanceCounter(StartCount);
  5.   Render;
  6.   QueryPerformanceCounter(EndCount);
  7.  
  8.   frametime_ms := (((EndCount - StartCount) / Freq ) * 1000);
  9.  
  10.   LimitFrameRate(?????);
  11.  
  12.   Done := false;
  13. end;
  14.  


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Jul 25, 2011 18:09 
Offline
DGL Member

Registriert: So Jul 24, 2011 15:40
Beiträge: 15
Hat denn niemand eine Lösung? :(


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Jul 25, 2011 22:50 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Du warst schon dicht dran:
Code:
  1.  
  2. var LastTicks:Int64;
  3.  
  4. procedure TMainform.loop(Sender: TObject; var Done: Boolean);
  5. var newTicks:Int64;
  6.     frametime_ms:Double;
  7. begin
  8.   QueryPerformanceCounter(newTicks);
  9.   frametime_ms := (((newTicks - LastTicks) / Freq ) * 1000);
  10.   LastTicks:=newTicks;
  11.   LimitFrameRate(frametime_ms);
  12.  
  13.   Render;
  14.  
  15.   Done := false;
  16. end;
  17.  


Eigentlich ist das fast das Gleiche wie das von igel457. Dein Fehler war bloß, dass du nur die Zeit zum Zeichnen gemessen hast, ohne die Wartezeit, die LimitFrameRate selbst bewirkt. Das steht ja eigentlich auch als Kommentar zu der Funktion: "atd" ist die Zeitdifferenz zwischen zwei Frames - inklusive der "Sleeptime".


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Jul 28, 2011 18:03 
Offline
DGL Member

Registriert: So Jul 24, 2011 15:40
Beiträge: 15
Danke dir ;)


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


Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 6 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.008s | 17 Queries | GZIP : On ]