1. Du hast done:=false vergessen
2. Deine Messmethode ist ungünstig. Dazu haben wir einige threads z.B. viewtopic.php?t=7574
Meine Lieblingsmethode für Spiele mit time based movement(aus dem Gedächtnis, kann also kleinere Fehler haben)
Code:
var LastTick:int64;//global
procedure OnIdle
varNow:int64;
DeltaT:real;
begin
Done:=false;
Now:=QueryPerformanceCounter;
DeltaT:=(Now-LastTick)/Freqenz;
if DeltaT>0.1then DeltaT:=0.1;
if DeltaT<=0.005then
begin
sleep(1);//Schläft zwar deutlich länger als eine ms, reduziert aber die CPU auslastung auf rechnern die schnell genug sind.
exit;
end;
LastTick:=Now;
Move(DeltaT);
Render;
end;
Eigenschaften:
1. Timebased movement
2. Misst die komplette Zeit zwischen zwei renders, also auch wenn andere Anwendungen zeit fressen.
3. Bei unter 10 fps wird das Spiel langsamer, da zu große DeltaTs bei vielen Spielen zu Problemen führen. z.B. wenn keine kontinuierliche Kollisionskontrolle implementiert ist. Hier ist ein DeltaT maximal 100ms.
4. Frameratenbegrenzer, theoretisch auf 200fps, praktisch wohl auf etwas weniger. Wenn der Rechner schneller ist, dann geht durch das sleep(1) die CPU-Auslastung herunter
5. Das Spiel pausiert automatisch wenn ein Menü (TMainMenu) offen ist, da dann OnIdle nicht mehr aufgerufen wird. Hier ist Begrenzung von DeltaT auf 100ms wieder wichtig, da sonst ein Zeitsprung nach dem schließen des Menüs stattfände.
6. Zeitdifferenz wird als real in der Einheit Sekunden an Move übergeben.
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.