Genauere Zeitmessung als Millisecs()
Übersicht
BlitzBasic
Blitz3D|
|
Lord_VaderBetreff: Genauere Zeitmessung als Millisecs() |
Antworten mit Zitat |
|---|---|---|
|
Guten Tag,
Bin erfreut zu sehen, dass es die Seite noch gibt. Trotz der Vermutung, dass keiner mehr antwortet |
||
|
|
XeresModerator |
Antworten mit Zitat |
|---|---|---|
|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
||
|
|
Lord_Vader |
Antworten mit Zitat |
|---|---|---|
|
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 |
Antworten mit Zitat |
|---|---|---|
|
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 |
Antworten mit Zitat |
|---|---|---|
|
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 | ||
Maximilian8 |
Antworten mit Zitat |
|
|---|---|---|
|
Moin! Viele gehen über die Delta-Zeit, um Animationen zu steuern, aber eine feste Bildrate macht vieles einfacher, besonders bei kleinen Projekten oder Spielen, bei denen alles vorhersehbar bleiben soll. Ich habe schon mal Spiele in Python mit fester FPS gebastelt, und das hat mir einige Bugs erspart, bei denen Bewegungen „springen“, wenn das Delta zu stark variiert.
Der einzige Punkt, an dem Delta-Zeit wirklich nötig ist, ist, wenn das Spiel sich an jede Bildrate oder variable Leistung anpassen soll, aber in vielen Fällen reicht die feste Methode völlig aus. |
||
|
|
Jan_Ehemaliger Admin |
Antworten mit Zitat |
|---|---|---|
|
@Lordvader, genauer als Millisekunden sollte für Animationen nicht notwendig sein.
Wenn man kleiner als 1ne Millisekunde braucht, dann bist du über 1000 FPS. Da wir beim sehen bei irgendwas von 30-100 FPS ausgehen ist alles über 1000 FPS unnötig. Ich prognostiziere mal dein Problem. Deine FPS springen von 1000, 500, 333 und 250 hin und her, dadurch versuchst du es genauer hinzubekommen. Da ist leider ein Fehler im Ansatz, Am Anfang jedes Frames nimmst du 1mal die Millisecs(). Wenn eine Animation startet dann speicherst du den Wert an dein Objekt. Nun kannst du aus der Differenz von Start bis jetzt problemlos errechnen wie weit die Animation ist. Jegliche Sprünge und Ungenauigkeiten sind damit eliminiert. Pseudocode Code: [AUSKLAPPEN] Function min (zahl1, zahl2) if zahl1<zahl2 then return zahl1 else return zahl2 End Function repeat jetzt=millisecs() if keyhit(20) then animstart = jetzt endif drawimage(animationsBild,10,10,min(floor((start-animstart)/100.0),lastFrame)) flip(0) until keyhit(1) Das ganze funktioniert in 2d sowie 3d. |
||
| between angels and insects | ||
Übersicht
BlitzBasic
Blitz3D
Powered by phpBB © 2001 - 2006, phpBB Group

