Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Newton Simulation beschleunigen (https://www.delphipraxis.net/87168-newton-simulation-beschleunigen.html)

igel457 24. Feb 2007 11:44


Newton Simulation beschleunigen
 
Hallo,

ich bin gerade dabei für meine 2D Engine ein Physiksystem mit Hilfe von Newton zu bauen. Das ganze Funktioniert soweit ganz gut. Problem ist nur, dass die Simulation schrecklich träge ist, d.h. meine Kisten fallen furchtbar langsam.

Mit folgendem Code rufe ich die "NewtonUpdate" Funktion mit einer festgelegten Framerate (100FPS) auf:
Delphi-Quellcode:
FTime := FTime + timegap*1000; //Timegap ist die Zeit seit dem letzten Frame in Sekunden
while FTime > FInterval do
begin
  FTime := FTime - FInterval;
  NewtonUpdate(NewtonWorld, FInterval / 1000);
end;
Mit folgendem Code habe ich genau das gleiche Ergebnis:
Delphi-Quellcode:
NewtonUpdate(NewtonWorld, timegap);
Mit
Delphi-Quellcode:
NewtonUpdate(NewtonWorld, 0.1);
ist die Geschwindigkeit in Ordnung aber ist nun von den FPS abhängig.

In den Demos, die ich gefunden habe wird das ganze wie im ersten Code gemacht, allerdings fallen die Kisten dort mit "Normaler" geschwindigkeit.

Ich denke, dass dies bei mir am Koordinatensystem liegt. Schließlich arbeitet meins mit absoluten Pixeln und in den 3D Anwendungen mit viel kleineren Fließkommazahlen.

Kann ich irgendwie die Bewegungen schneller machen, also die gesamte Simulation beschleunigen? In der Dokumentation bin ich auf keine entsprechende Funktion gestoßen, aber vielleicht bin ich auch einfach nur Blind.

Schonmal Danke,
Igel457

kolbaschedder 24. Feb 2007 12:02

Re: Newton Simulation beschleunigen
 
Hi,

welche Grafikschnittstelle verwndest du denn? Wie erzeugst du deine 100FPS? ein normaler Timer sollte das nicht schaffen ( minimale Zeitrate liegt glaub ich bei 55ms, was aber auc reichen würde). Nicht das deine ganze Rechenleistung fürs zeichnen draufgeht.
Verwndest du DirchtX, OpenGL oder die normale GDI?

Das nächste wären deine Funktion newtonUpdate(). vielleicht lässt sich da noch einiges rausholen

Nicolai1234 24. Feb 2007 12:19

Re: Newton Simulation beschleunigen
 
Wie sieht den NewtonUpdate aus? Wenigstens mal der grobe Aufbau. Vielleicht liegt doch ja auch ein Fehler.

igel457 24. Feb 2007 13:29

Re: Newton Simulation beschleunigen
 
Zitat:

Zitat von kolbaschedder
Wie erzeugst du deine 100FPS?

Habe ich doch gezeigt. Das ganze wird im OnIdle Event aufgerufen. Timegap ist die Zeit in Sekunden seit dem letzten Frame und FIntervall steht auf 100, somit werden 100FPS erzeugt.
Das geht schon und ist auch nicht mein Problem!

Zitat:

Zitat von kolbaschedder
Verwndest du DirchtX, OpenGL oder die normale GDI?

Auch wenn auch das egal ist, ich verwende Andorra 2D.


Zitat:

Zitat von Nicolai1605
Wie sieht den NewtonUpdate aus? Wenigstens mal der grobe Aufbau. Vielleicht liegt doch ja auch ein Fehler.

Ich habe den Sourcecode von NewtonUpdate nicht. Die Funktion liegt in der Newton.dll. Aber die beschreibung in der Dokumentation sagt:

Zitat:

Zitat von Newton Game Dynamics Dokumentation
NewtonUpdate
void NewtonUpdate(const NewtonWorld* newtonWorld,dFloat timestep)

Advance the simulation by an amount of time.

Parameters
const NewtonWorld *newtonWorld - is the pointer to the Newton world
dFloat timestep - time step in seconds

Remarks
This function will advance the simulation by the amount of time specified by timestep. The Newton Engine does not perform sub-steps, and does not need tuning parameters. It is the responsibility of the application to ensure that timestep is small enough to guarantee physics stability.

Ich glaube, dass ihr mein Problem nicht richtig versteht. Also nochmal:
Die Simulation funktioniert Klasse. Leider sind die Bewegungen viel zu langsam was daher rührt, das mein Koordinatensystem um das Hundertfache größer ist als voreingestellt. Daher sind auch die Bewegungen um das Hundertfache langsamer. Ich suche nach einer Möglichkeit dem Newton direkt zu sagen, dass es alles mit 100 mal nehmen soll und habe gehofft das sich hier jemand damit auskennt.

Trotzdem Danke,
igel457

Nicolai1234 24. Feb 2007 13:35

Re: Newton Simulation beschleunigen
 
Zitat:

Zitat von igel457
Ich glaube, dass ihr mein Problem nicht richtig versteht. Also nochmal:
Die Simulation funktioniert Klasse. Leider sind die Bewegungen viel zu langsam was daher rührt, das mein Koordinatensystem um das Hundertfache größer ist als voreingestellt. Daher sind auch die Bewegungen um das Hundertfache langsamer. Ich suche nach einer Möglichkeit dem Newton direkt zu sagen, dass es alles mit 100 mal nehmen soll und habe gehofft das sich hier jemand damit auskennt.

hmm, so habe ich das bisher nicht verstanden.
Reicht es dann nicht, wenn du
Delphi-Quellcode:
FTime := FTime + timegap*1000; //Timegap ist die Zeit seit dem letzten Frame in Sekunden
while FTime > FInterval do
begin
  FTime := FTime - FInterval;
  NewtonUpdate(NewtonWorld, FInterval / 1000);
end;
in
Delphi-Quellcode:
FTime := FTime + timegap*1000; //Timegap ist die Zeit seit dem letzten Frame in Sekunden
while FTime > FInterval do
begin
  FTime := FTime - FInterval;
  NewtonUpdate(NewtonWorld, FInterval / 10); //Also *100
end;
änderst?

igel457 24. Feb 2007 13:44

Re: Newton Simulation beschleunigen
 
Zitat:

Zitat von Nicolai1605
in
Delphi-Quellcode:
FTime := FTime + timegap*1000; //Timegap ist die Zeit seit dem letzten Frame in Sekunden
while FTime > FInterval do
begin
  FTime := FTime - FInterval;
  NewtonUpdate(NewtonWorld, FInterval / 10); //Also *100
end;

Du hast Recht, damit läuft es logischerweise schneller.
Ich hatte nur gehofft, dass es da einen "schöneren" Weg gibt. So gaukle ich dem Newton ja einfach vor, es sei viel mehr Zeit zum letzten Frame vergangen. Ich werde es aber trotzdem mal so lassen.

Nochmal Danke,
igel457

Cöster 24. Feb 2007 17:35

Re: Newton Simulation beschleunigen
 
Zitat:

Zitat von igel457
FIntervall steht auf 100, somit werden 100FPS erzeugt.

Hm??? :gruebel: würde ein Intervall von 100 ms nicht 10 FPS bedeuten

igel457 24. Feb 2007 18:51

Re: Newton Simulation beschleunigen
 
Sorry, ich meinte natürlich dass FIntervall auf 10 steht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:09 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz