![]() |
Timed Movement - Beste Methode?
Hi ich hab mal ne Frage, die ich dringend für mein Projekt brauche:
--> ![]() Und zwar geht es darum, die FPS-Rate zu erhöhen, aber trotzdem die Bewegungen in der richtigen Geschwindigkeit zu halten. Bisher habe ich dies einfach mit einem Timer gemacht. Das soll sich aber schleunigst ändern. Hier mal ein paar Beispiele zur besseren Verständniss: Dieses hier möchte ich eigentlich verwenden:
Delphi-Quellcode:
Das funktioniert auch wunderbar.
procedure TGameF.IdleHandler(Sender: TObject; var Done: Boolean);
begin FrameTime := GetTickCount - LastRender ; LastRender := GetTickCount; Inc(TimeCount, FrameTime); Inc(FrameCount); if TimeCount >= 1000 then begin FrameRate := FrameCount; TimeCount := TimeCount - 1000; If TimeCount>2000 then TimeCount := 0; FrameCount:= 0; end; GameE.GameTic(FrameTime); // <-- Die Render Methode DDraw.Surface.Canvas.release; DDraw.Flip; sleep(1); Done:= false; end; Doch dabei gibt es nun zwei Probleme: 1.)Die Methode mit GetTickCount für einen einzelnen Frame viel zu ungenau ist. Desshalb möchte ich - - diese lieber immer für meherere Frames die Zeit messen soll, damit dies genauer wird. 2.)Wie sorge ich dafür, dass die Bewegungen der Objekte die richtigen Geschwindigkeiten haben. (Momentane Werte sind bei ca.30 FPS genau richtig) Ich freue mich dann schon mal auf ein heiß diskutiertes Thema! MFG |
Re: Timed Movement - Beste Methode?
Dein Ansatz ist schon korrekt. Du misst die Zeit zwischen zwei Frames und multiplizierst diesen Wert mit all deinen Bewegungen, also z.B.
Objekt.x := Objekt.x + 23*FrameTime; Wenn du mehr Genauigkeit wünschst dann nimm den High Performance Counter. Pseudocode:
Delphi-Quellcode:
Damit erhälst du dann am Ende eine Frametime in Sekunden.
var
CounterAvailable: Boolean; Frequency: Int64; CounterAvailable := QueryPerformanceFrequency(Frequency); // ... QueryPerformanceCounter(Start); // Frame QueryPerformanceCounter(Ende); FrameTime := (Ende - Start) / Frequency; Diese Methode verwendet so ziemlich jedes Spiel. karlkoch |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:50 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz