Genauere Zeitmessung als Millisecs()

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

Lord_Vader

Betreff: Genauere Zeitmessung als Millisecs()

BeitragMo, Feb 17, 2025 9:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Guten Tag,

Bin erfreut zu sehen, dass es die Seite noch gibt.

Trotz der Vermutung, dass keiner mehr antwortet

Xeres

Moderator

BeitragMo, Feb 17, 2025 21:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist aber kein Grund, komplett auf Erklärung des nötigen Kontextes zu verzichten.

BB hat afaik keine höhere Auflösung als Millisecs - die Frage wäre, was du in ein paar Mikrosekunden anstellen willst.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Lord_Vader

BeitragDi, Feb 18, 2025 0:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Xeres hat Folgendes geschrieben:
Das ist aber kein Grund, komplett auf Erklärung des nötigen Kontextes zu verzichten.

BB hat afaik keine höhere Auflösung als Millisecs - die Frage wäre, was du in ein paar Mikrosekunden anstellen willst.


ich möchte eigentlich eine genauere zeitmessung zwischen frames. dient der berechnung von bewegungen.

Silver_Knee

BeitragMi, Feb 19, 2025 3:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Nicht, dass ich glaube, dass das notwendig ist - an den Unterschieden <1ms sollte die Berechnung nicht scheitern - hier trotzdem der Weg, wie du da hinkommen könntest:

In der Windows API gibt es die Befehle QueryPerformanceFrequency und QueryPerformanceCounter. Die kann man nutzen um sehr genaue Timestamps zu bekommen:

https://learn.microsoft.com/de...ime-stamps

Die Befehle gibt es aber nicht von Haus aus in B3D. Du kannst sie aber mit Userlibs verfügbar machen. Leider finde ich gerade keine schöne Online-Hilfe dafür, daher hier die Text-Datei, die B3D zu dem Thema beiliegt:

https://github.com/blitz-resea...erLibs.txt

Du musst also eine .decls-Datei in den userlibs-Ordner deiner Blitz3D-Installation packen. Wenn du dir die API-Doku zu QueryPerformanceFrequency und QueryPerformanceCounter anschaust, wirst du sehen, dass die in der kernell32.dll liegen. Netterweise hat jemand schon mal eine decls-Datei für alle Befehle in der kernell32.dll geschrieben:

https://www.blitzbasic.org/forum/topic.php?id=1492

Du kannst die ganze Datei bei dir ablegen oder nur die Zeilen für die beiden Befehle:

Code: [AUSKLAPPEN]
.lib "kernel32.dll"
api_QueryPerformanceCounter% (lpPerformanceCount*) : "QueryPerformanceCounter"
api_QueryPerformanceFrequency% (lpFrequency*) : "QueryPerformanceFrequency"


Nun der eigentlich schwierige Part:
Die Rückgabe der Frequency und des Counters erfolgt nicht als Rückgabewert sondern als Pointer in lpPerformanceCount und lpFrequency. Wenn ich mich richtig erinnere (habe das jahrelang nicht mehr gemacht) wäre der einzige Weg in B3D an diese Werte zu kommen, wenn du eine Bank übergibst. Dann sind nach dem Aufruf die gewünschten Werte in der Bank. Die Bank braucht die richtige Größe von "LARGE_INTEGER".
Wenn ich das https://learn.microsoft.com/en...integer-r1 richtig interpretiere, ist das immer 64-Bit (bin auch kein C-Meister), also eine Bank mit 8 Byte.

Und dann kannst du die beiden Werte vor und nach Frame vergleichen. Leider hast du in Blitz keine 64-Bit Zahlen wenn ich mich richtig erinnere, aber wenn du nicht erwartest dass dein Frame > 2^32 ms dauert, reicht es vielleicht die hinteren 4 Bytes aus der Bank als Int auszulesen und zu vergleichen. Wahrscheinlich macht es Sinn die Prozedur mit der Bank, dem Call und dem auslesen in eine Funktion auszulagern. Wenn du CreateBank in der Schleife machst, vergiss nicht FreeBank, um nicht gnadenlos allen RAM deines PCs für Banks zu belegen, die du nur einmal verwendet hast.

SpionAtom

BeitragMi, Feb 19, 2025 9:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Standardweg wäre ja andersherum: Man zählt die Frames pro Sekunde, und errechnet sich ein Delta Time, also die Zeit zwischen zwei Frames. Diese multipliziert man auf die Geschwindigkeit.

Kleiner Deepdive (auf englisch):
https://youtu.be/yGhfUcPjXuE?si=4rSrcsRonAgyuz9n


Wobei ich immer mit einer festen Framerate meine Spielchen programmiert hatte. Das hatte vieles für mich einfacher gemacht.
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group