PB Physic Engine - Entwicklung und Doku

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Chimorin
Beiträge: 451
Registriert: 30.01.2013 16:11
Computerausstattung: MSI GTX 660 OC mit TwinFrozr III
6Gb DDR 3 RAM
AMD Phenom II X4 B55 @ 3,6GHz
Windows 7 Home Premium 64-bit

Re: PB Physic Engine - Entwicklung und Doku

Beitrag von Chimorin »

Sorry für die späte Antwort, bin grade am Suchen nach den Werten für optimale Massen (Ich glaube, dass es zwischen 0,05 und 20 war).

Eine Kraft, bzw. ein Impuls wirkt zwischen 2 RenderWorld()-Aufrufen. D.H. meiner Meinung nach, dass die Zeit, mit der RenderWorld(ElapsedPhysicallyTime) gefüttert wurde, nach
a = F / m
und p / m = v
mit -> s = v*t + 1/2*a*t² berechnet wird. "t" ist dabei die eingefütterte Zeit. Was allerdings der Standartwert ist, weiß ich nicht (vllt. 16 oder 17ms wegen 60Hz?!)
Ich benutze das immer so:

Code: Alles auswählen

frameZeit = RenderWorld(frameZeit)
RenderWorld() bekommt als vergangene Zeit die Zeit, die seit dem vorletzten Bild zum letzten vergangen ist.
Bild

- formerly known as Bananenfreak -
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Re: PB Physic Engine - Entwicklung und Doku

Beitrag von Regenduft »

Bananenfreak hat geschrieben:"t" ist dabei die eingefütterte Zeit. Was allerdings der Standartwert ist, weiß ich nicht (vllt. 16 oder 17ms wegen 60Hz?!)
Ca. 17 ms sind richtig, außer wenn Du (z.B.) einen Framedrop hast; dann ist es entsprechend das Doppelte.
Bananenfreak hat geschrieben:Ich benutze das immer so:

Code: Alles auswählen

frameZeit = RenderWorld(frameZeit)
Öhm... das ist doch doppelgemoppelt... oder? Parameter und Rückgabewert sollten immer gleich sein. Der Rückgabewert ist eigentlich nur interessant, wenn Du keinen Parameter angibst.
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
Benutzeravatar
Chimorin
Beiträge: 451
Registriert: 30.01.2013 16:11
Computerausstattung: MSI GTX 660 OC mit TwinFrozr III
6Gb DDR 3 RAM
AMD Phenom II X4 B55 @ 3,6GHz
Windows 7 Home Premium 64-bit

Re: PB Physic Engine - Entwicklung und Doku

Beitrag von Chimorin »

Nope, du musst das zeitlich sehen.
Bild

- formerly known as Bananenfreak -
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Re: PB Physic Engine - Entwicklung und Doku

Beitrag von Regenduft »

Jetzt stehe ich auf der Leitung... Habe keine Ahnung was Du mit "du musst das zeitlich sehen" meinst...
Denke mal Du beziehst Dich auf folgendes:
Regenduft hat geschrieben:
Bananenfreak hat geschrieben:Ich benutze das immer so:

Code: Alles auswählen

frameZeit = RenderWorld(frameZeit)
Öhm... das ist doch doppelgemoppelt... oder? Parameter und Rückgabewert sollten immer gleich sein. Der Rückgabewert ist eigentlich nur interessant, wenn Du keinen Parameter angibst.
Laut PB-Doku definierst Du mit dem Parameter "frameZeit" doch, wie viel Zeit seit dem letzten Aufruf von RenderWorld() vergangen ist. Der Rückgabewert "frameZeit" entspricht laut PB-Doku ebenso der Zeit, welche seit dem letzten Aufruf von RenderWorld() vergangen ist. Wo ist da mein Denkfehler? :?
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
Benutzeravatar
Chimorin
Beiträge: 451
Registriert: 30.01.2013 16:11
Computerausstattung: MSI GTX 660 OC mit TwinFrozr III
6Gb DDR 3 RAM
AMD Phenom II X4 B55 @ 3,6GHz
Windows 7 Home Premium 64-bit

Re: PB Physic Engine - Entwicklung und Doku

Beitrag von Chimorin »

Du fütterst die Engine mit der Zeit des VORletzten Frames, der Rückgabewert ist die Zeit des letzten Frames.
Bei jeder Funktion wird zuerst die Funktion mit den gegebenen Parametern ausgeführt, erst danach wird ein Wert zurückgegeben.
frameZeit (t1) = RenderWorld(frameZeit (t0))
Bild

- formerly known as Bananenfreak -
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Re: PB Physic Engine - Entwicklung und Doku

Beitrag von Regenduft »

Danke, jetzt habe ich's geschnallt! :allright:
Da ist wohl die PB-Doku etwas ungenau, denn da heißt es beide Male "vergangene Zeit seit dem letzten Frame".

Da kann man ja dann supereinfach Zeitraffer/Zeitlupe zusammenbasteln!

Code: Alles auswählen

frameZeit = RenderWorld(frameZeit * ZeitFaktor)
Allerdings kann man in Deinem einfachen Beispiel dann doch trotzdem den Parameter weglassen, oder? Wenn ich im Beispiel-Code "Bridge.pb" das RenderWorld() mit dem folgenden Code ersetze, dann erhalte ich bei "#TestCode = 1" und "#TestCode = 2" exakt die selben Ergebnisse - sowohl optisch, als auch von den per Debugger ausgegebenen Werten her:

Code: Alles auswählen

      #TestCode = 1
      Delay(3000)
      CompilerSelect #TestCode
        CompilerCase  1 : Debug RenderWorld()
        CompilerCase  2 : t = RenderWorld(t) : Debug t
      CompilerEndSelect
      If exitcounter = 4 : ShowDebugOutput() : CallDebugger : End : EndIf : exitcounter + 1
Ich hatte mal versucht mit GrabSprite() und GrabDrawingImage() Screenshots zu machen, allerdings schlug beides fehl. Zum einen gab GrabSprite() Null rück; zum anderen gab ScreenOutput() bei StartDrawing(ScreenOutput()) Null rück. Sehr seltsam...
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
Benutzeravatar
Chimorin
Beiträge: 451
Registriert: 30.01.2013 16:11
Computerausstattung: MSI GTX 660 OC mit TwinFrozr III
6Gb DDR 3 RAM
AMD Phenom II X4 B55 @ 3,6GHz
Windows 7 Home Premium 64-bit

Re: PB Physic Engine - Entwicklung und Doku

Beitrag von Chimorin »

Den Unterschied zwischen meinem Code und einem RenderWorld() ohne Parameter bemerkst du meiner Meinung nach* nur bei kleinen FPS-Zahlen. Mein Code füttert die Engine mit einer variablen Zeit, die bei kleinen FPS-Zahlen eben größer ist. Sonst ruckelt ein Spiel nicht, sondern läuft in erster Linie viel langsamer ab.

*Meiner Meinung nach: Schreibe ich so, weil es ja sein kann, dass ein RenderWorld ohne Parameter die Physikzeit selber ausrechnet und nicht eine Konstante mit dem Wert 17 benutzt oder so...
Bild

- formerly known as Bananenfreak -
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Re: PB Physic Engine - Entwicklung und Doku

Beitrag von Regenduft »

Da hat wohl einer meinen Code-Schnipsel nicht angeguckt. ;-)

RenderWorld() ohne Parameter rechnet definitiv die Physikzeit selbst aus! Ich habe im Code in der Hauptscheife ein Delay(3000) eingefügt und es gab trotzdem keinen merklichen Unterschied! Ein Konstanter Wert kann also ausgeschlossen werden.
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
Benutzeravatar
Chimorin
Beiträge: 451
Registriert: 30.01.2013 16:11
Computerausstattung: MSI GTX 660 OC mit TwinFrozr III
6Gb DDR 3 RAM
AMD Phenom II X4 B55 @ 3,6GHz
Windows 7 Home Premium 64-bit

Re: PB Physic Engine - Entwicklung und Doku

Beitrag von Chimorin »

Was dein Testcode macht ist in jedem Fall das selbe.
Fall 1:
Du debuggst die Zeit seit dem letzten Aufruf.

Fall 2:
Du schreibst die Zeit seit dem letzten Aufruf in eine Variable, diese wird debuggt.
=> Du debuggst die Zeit seit dem letzten Aufruf.
Bild

- formerly known as Bananenfreak -
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Re: PB Physic Engine - Entwicklung und Doku

Beitrag von Regenduft »

+ das optisch genau das gleiche herauskommt. (Wie gesagt: Screenshots haben leider nicht funktioniert und ich hatte keine Lust mich jetzt damit zu beschäftigen warum)
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
Antworten