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

Aktuelle Zeit: Do Jul 03, 2025 10:03

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



Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: QueryPerformanceCounter...
BeitragVerfasst: Mo Jan 20, 2003 00:20 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
huhu,

ich hab mal ne frage zu QueryPerformanceCounter...

Also, beim Start des Programmes mach ich:

Code:
  1.       QueryPerformanceFrequency(FreqQPC);
  2.  
  3.       QueryPerformanceCounter(NextQPC);      
  4.  
  5.       Frequency:=FreqQPC/100;


und dann in einem extra Thread:

Code:
  1.     QueryPerformanceCounter(AktuQPC);
  2.  
  3.     if AktuQPC > NextQPC + FreqQPC then begin
  4.  
  5.       QueryPerformanceCounter(NextQPC);
  6.  
  7.       [Restlichen Code]
  8.  
  9.     end;


Wenn ich das drin hab wird das was ich da jetzt als [Restlichen Code] gemacht hab, nur super langsam ausgeführt... wenn ich dieses "If AktuQPC >..." weglasse isses super shcnell... hab ich da nen LogikFehler drin oder geht das so auf die art und weise garnich???

Au'revoir,
Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 20, 2003 00:33 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
ahh... ich glaube ich weiß meinen fehler...

Code:
  1. Frequency:=FreqQPC/100


Ne Int64 zahl wird wohl ein wenig zu groß sein für nen SingleWert... :)
Also brauch ich sowas wie Int64 ist für KommaZahlen.. *wühlt*

Oder einen befehl der mir mein gerundeten Int64 Wert abrundet.... mh... Round rundet nur zu Integer, oder?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 20, 2003 00:38 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
lag wohl doch woanders dran... :(


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 20, 2003 05:38 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Wie ich dir schon per PM geschrieben hab, erkenn ich den Sinn nicht, die Sache mit dem QPFC in nem extra Thread zu machen...eigentlich macht das nur Sinn, wenn du die Counterabfrage in deiner Renderschleife machst, oder spaltest du etwa nen extra Render-Thread ab?

Nochmal zur Erinnerung (wir haben uns doch ausgiebig per PM über Time-Based-Movement unterhalten, deshalb versteh ich dein Prob auch nicht ?!?) :

Code:
  1.  
  2.  
  3. // Zuerst die Frequenz des Hi-Res-Timers ermitteln
  4.  
  5. procedure Init;
  6.  
  7. begin
  8.  
  9. QueryPerformanceFrequency(Freq);
  10.  
  11. end;
  12.  
  13.  


Code:
  1.  
  2.  
  3. procedure Draw;
  4.  
  5. begin
  6.  
  7. QueryPerformanceCounter(StartCount);
  8.  
  9. DrawScene;
  10.  
  11. QueryPerformanceCounter(FrameEndCount);
  12.  
  13. SpeedFactor := (FrameEndCount-StartCount)*100;
  14.  
  15. MoveObjects(TimeFactor);
  16.  
  17. end;
  18.  
  19.  


Jetzt hast du in SpeedFactor die Zeit in ms, die das System benötigt hat um den letzten Frame zu rendern, und anhand dieses Faktors lässt sich dann ganz einfach ermitteln wie schnell du deine Objekte bewegen musst!

P.S. : Dein von dir oben gelisteter Code macht irgendwie keinen Sinn...vielleicht liegts auch daran, das du nur ein paar Schnippsel gepostet hast...

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 20, 2003 11:37 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Mai 06, 2002 20:27
Beiträge: 479
Wohnort: Bremen
@SOS:
bin vielleicht etwas verpeilt, aber dein code macht irgendwie keinen sinn....

Zitat:
Code:
  1. SpeedFactor := (FrameEndCount-StartCount)*100;
  2.  
  3. MoveObjects(TimeFactor);
  4.  
  5.  


Erstmal, was soll der Unterschied zwischen SpeedFactor und TimeFactor sein? Und, zweiterdings: warum die Anzahl der beim Zeichnen verstrichenen Counts mit 100 multiplizieren? Ich hätte jetzt eigentlich erwartet, dass du durch die Frequenz teilst um die verstrichene Zeit zu erhalten.

_________________
Selber Denken macht klug!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 20, 2003 12:09 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Zitat:
Erstmal, was soll der Unterschied zwischen SpeedFactor und TimeFactor sein? Und, zweiterdings: warum die Anzahl der beim Zeichnen verstrichenen Counts mit 100 multiplizieren? Ich hätte jetzt eigentlich erwartet, dass du durch die Frequenz teilst um die verstrichene Zeit zu erhalten.


Tja, das kommt davon, wenn man grade morgens um fünf aus den Federn steigt, und dann auf solche Postings antwort geben muss :roll:
Das muss natürlich so aussehen :
Code:
  1.  
  2.  
  3. SpeedFactor := ((FrameEndCount-StartCount)/Frequency)*100;
  4.  
  5. MoveObjects(SpeedFactor );
  6.  
  7.  


Dann erhält man die korrekte Renderzeit in ms.
Aber es ist schon leicht nervig, wenn man das jemandem groß und breit per PM erklärt hat, und die Frage dann von der selben Person wieder kurz darauf im Forum gestellt wird :evil:

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 20, 2003 12:50 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

Also... (@SOS: Hab deine PM nochnich gelesen, mach ich gleich)

Der grund warum ich es nicht so machen kann das ich das Objekt mal um 1 bewege, bei weniger FPS um 1.3 und bei viel FPS um nur 0.5 etc liegt daran das es bei meinem Snake auf die Art leider nicht geht...

Hängt damit zusammen wie ich die hinteren teile der Schlange bewege etc.


Und warum ich nen eigenen Thread dafür gemacht hab:
Die Bewegung muß doch UNABHÄNGIG der FPS sein... wenn ich die abfrage in der RenderProcedure machen würde, währe sie wieder FPS abhängig... zummindest solange man unter 100FPS hat.. bei allem über 100FPS würde es funktionieren.

Au'revoir,
Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 20, 2003 12:55 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Zitat:
Und warum ich nen eigenen Thread dafür gemacht hab:
Die Bewegung muß doch UNABHÄNGIG der FPS sein... wenn ich die abfrage in der RenderProcedure machen würde, währe sie wieder FPS abhängig... zummindest solange man unter 100FPS hat.. bei allem über 100FPS würde es funktionieren.


Nein.Das ist falsch!

Deshalb mach ichs ja mit dem QueryPerformanceCounter, der mir hinterher ja nen Zeitfaktor liefert.Je nach FPS-Zahl ergibt deshalb die Bewegungsgeschwindigkeit multiplitziert mit dem per QPFC errechenten Zeitfaktor immer den gleichen Wert, egal ob das Spiel mit 10, 100 oder 500fps läuft.

Bei 100fps brauch der Rechner 1ms um das Bild zu rendern :
Tastatur wird nach 1ms abgefragt -> Bei Tastendruck : Bewegung = 1ms*1 Welteinheit = 1 Welteinheit

Bei 50fps brauch der Rechner 2ms um das Bild zu rendern :
Tastatur wird nach 2ms abgefragt -> Bei Tastendruck : Bewegung = 2ms*1 Welteinheit = 2 Welteinheiten

Bei 300fps brauch der Rechner 0.333ms um das Bild zu rendern :
Tastatur wird nach 0.333ms abgefragt -> Bei Tastendruck : Bewegung = 0.333ms*1 Welteinheit = 0.333 Welteinheiten

Wie man sieht, bewegt sich das Objekt unabhängig von der Renderzeit immer um den gleichen Wert.Hoffe der Sinn und Zweck von QPFC wird jetzt etwas deutlicher!

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 20, 2003 12:59 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Mir is doch klar wie du das meinst... so mach ich es ja in anderen spielen auch...

Nur (!) wenn ich bei meinem Snake die Schlange aufeinmal um 0.3 einheiten bewege, anstelle nur um 0.1, dann wird sie ausseinander gerupft.. Das liegt einfach an der Art wie ich die Schlangenteile aneinander hänge.

Au'revoir,
Aya~


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


Wer ist online?

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