AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Timed Movement - Beste Methode?

Ein Thema von olee · begonnen am 22. Feb 2008 · letzter Beitrag vom 22. Feb 2008
Antwort Antwort
Benutzerbild von olee
olee

Registriert seit: 16. Feb 2008
Ort: Boppard
540 Beiträge
 
Turbo Delphi für Win32
 
#1

Timed Movement - Beste Methode?

  Alt 22. Feb 2008, 00:41
Hi ich hab mal ne Frage, die ich dringend für mein Projekt brauche:

--> UT2D Projekt

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:
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;
Das funktioniert auch wunderbar.

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
Björn Zeutzheim
Codename: Performancepumpe
  Mit Zitat antworten Zitat
karlkoch

Registriert seit: 26. Feb 2006
Ort: Leipzig
30 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Timed Movement - Beste Methode?

  Alt 22. Feb 2008, 01:14
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:
var
  CounterAvailable: Boolean;
  Frequency: Int64;

CounterAvailable := QueryPerformanceFrequency(Frequency);

// ...

QueryPerformanceCounter(Start);

// Frame

QueryPerformanceCounter(Ende);

FrameTime := (Ende - Start) / Frequency;
Damit erhälst du dann am Ende eine Frametime in Sekunden.

Diese Methode verwendet so ziemlich jedes Spiel.

karlkoch
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:51 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz