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

Aktuelle Zeit: Do Jul 10, 2025 13:18

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



Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Time based movement
BeitragVerfasst: Do Okt 30, 2008 22:32 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Jul 22, 2006 00:43
Beiträge: 30
Wohnort: Borland
Hallo Community,

ich habe mich soeben daran versucht time based movement in mein Projekt zu integrieren, allerdings habe ich das Gefühl, dass ich das Tutorial dazu im Wiki nicht ganz verstanden habe, denn es funktioniert nicht ganz :? Auf einem langsameren Rechner ist die Bewegung leider immer noch langsamer.

Ich habe versucht das Ganze etwas zu vereinfachen und es in eine Funktion gepackt, sodass der korrigierte Wert zurückgegeben wird. Das sieth dann in etwa so aus:

Code:
  1.  
  2. function TUnit.TBMCorrection(speed: Double):double;
  3. var
  4.   BerechnungsZeit : Int64;
  5.   Frequenz        : Int64;
  6.   AktuelleZeit    : Int64;
  7. begin
  8.   if not QueryPerformanceFrequency(Frequenz) then // Frequenz ermitteln
  9.    raise Exception.create('Kein Hardware Timer vorhanden');
  10.   QueryPerformanceCounter(BerechnungsZeit); // Aktuelle Zeit ermitteln
  11.  
  12.   QueryPerformanceCounter(AktuelleZeit);
  13.  
  14.   result := speed * ((AktuelleZeit - BerechnungsZeit) / Frequenz) *1000000;
  15. end;
  16.  
  17. // ---------------------
  18.  
  19. procedure TShip.move(speed: double);
  20. const
  21.   RotZAxis  : TVector3f = (0, 0, 1);
  22. var
  23.   Direction : single;
  24.   LookVec   : TVector4f;
  25.   i         : Integer;
  26.   noMove    : boolean;
  27. begin
  28.   //TBM
  29.   speed := TBMCorrection(speed);
  30.  
  31.   LookVec[0] := 0;
  32.   LookVec[1] := 1;
  33.   LookVec[2] := 0;
  34.   LookVec[3] := 0;
  35.  
  36.   // Den Look-Vektor um die Z-Achse drehen
  37.   VectorRotate(LookVec, RotZAxis, -DegToRad(Rotation));
  38.  
  39.   if(not noMove) then
  40.   begin
  41.     PosVect[0] := PosVect[0] + (LookVec[0] * (Direction * speed));
  42.     PosVect[1] := PosVect[1] + (LookVec[1] * (Direction * speed));
  43.     PosVect[2] := PosVect[2] + (LookVec[2] * (Direction * speed));
  44.   end;
  45. end;
  46.  


Nebenbei: TShip ist eine abgeleitete Klasse von TUnit. Der Code wurde vorerst mal auf das Nötigste reduziert.
Es sieht ganz danach aus, als wäre es nicht der richtige Weg den Zeitunterschied so zu ermitteln:

Code:
  1.  
  2.   QueryPerformanceCounter(BerechnungsZeit);
  3.   QueryPerformanceCounter(AktuelleZeit);
  4.  


Dadurch wird wohl auch der Faktor letztenendes so klein, dass ich mit einem weiteren Faktor (1Mio) multiplizieren muss um wieder auf eine halbwegs ordentliche Zahl zu kommen. Die Frage ist jetzt, was muss zwischen den beiden Zeilen stehen, an denen die aktuelle Zeit abgegriffen wird? Irgendwie geht das aus dem Tutorial nicht ganz hervor oder ich habe es nicht richtig interpretiert :D

Wäre sehr dankbar für jede Hilfe :)

Mfg
MB


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 31, 2008 10:36 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Der Grund liegt darin, dass du die beiden Zeiten sofort hintereinander misst. Dadurch bekommst du einen Wert, der ziehmlich genau demjenigen von Frequency entsprechen sollte, vllt das drei oder vierfache.

Du musst das ungefähr so machen:
Code:
  1.  
  2. // Ein paar Variablen
  3. var
  4.   Frequency: Double;
  5.   LastFrame: Double;
  6.  
  7. // Initialisierungsmethode (Frequency sollte man nicht jeden Frame abfragen)
  8. begin
  9.   if not QueryPerformanceFrequency(Frequency) then
  10.     // Raise error
  11.   // Last frame einmal initialisieren, damits nicht zu einem großen Sprung beim
  12.   // start des Programms kommt
  13.   QueryPerformanceCounter(LastFrame);
  14. end;
  15.  
  16. // Deine Rendermethode, wo auch alle berechnungen stattfinden
  17. var
  18.   CurrentFrame: Double;
  19.   PassedTime: Double;
  20. begin
  21.   QueryPerformanceCounter(CurrentFrame);
  22.   PassedTime := (CurrentFrame - LastFrame) / Frequency;
  23.   // Framerate beschränken. Eine Framerate von > 100 Hz ist meistens
  24.   // sinnlos
  25.   if (PassedTime < 0.01) then
  26.     Exit;
  27.   LastFrame := CurrentFrame;
  28.  
  29.   // Mach alles, was zu tun ist. Berechnungen, Rendern, sonstwas
  30. end;
  31.  

(Anmerkungen: Frequency und LastFrame sind globale Variablen oder Variablen, die zu der Klasse gehören, die das Rendern steuert. CurrentFrame und PassedTime sind lokale Variablen der Methode, die das Rendern steuert)

Damit misst du immmer bei beginn des Frames die aktuelle Zeit. Dazu hast du in LastFrame die Zeit des letzten Frames. Wenn du die voneinander Subtrahierst, dann erhälst du die vergangen Zeit. Geteilt durch Frequency hast du die Zeit in Sekunden. Diesen Wert kannst du jetzt für dein TBM verwenden.

Du hast deine Zeit wie gesagt direkt hintereinander in einem Frame gemessen. Damit hattest du einen seeeeeehr geringen Zeitabstand, der kaum zu gebrauchen war.

Ich hoffe, das hilft dir.

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 31, 2008 12:47 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Jul 22, 2006 00:43
Beiträge: 30
Wohnort: Borland
Hi Lord Horazont.
Habe es nun wie oben implementiert und siehe da, es funktioniert :D

Vielen Dank

Gruß
MB


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder 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.007s | 14 Queries | GZIP : On ]