Hellau
Sitze mal wieder an den typischen spiel-mit-der-Physik-Sachen rum. Gravitation und viele Massepunkte sind nett anzuschauen, umso mehr, desto besser.
In meiner Signatur ist LBM2, ein kleiner Benchmark mit jenem Thema. Ich möchte aber die Anzahl der Partikel drastisch erhöhen, mehrere 10er Potenzen. Der Benchmark ist in Blitzmax geschrieben, das tut aber nix zur Sache, es geht um jegliche Steigerung der Geschwindigkeit.
bisherige Ideen
Punkte initialisieren ( Punkt 0 ist gesondert initialisiert, ich gebe ihm eine besondere Masse, einer Sonne vergleichbar )
Die Hauptschleife sieht folgendermaßen aus,
sie sollte wohl für alle Coder sofort klar sein:
Der Code ist aus Blitzmax.
Alle Ideen sind gerne gehört
Wie gesagt, ich möchte mindestens in den Bereich 20.000 Points/Frame bei mind. 25Fps. Bei erfolgreicher Zusammenarbeit würde ich daraus gerne ein Tutorial zusammenstellen, verschiedene Sprachen, Optimierungswege, Umsetzung der physikalischen Formeln etc.. Natürlich mit Nennung aller Teilnehmer an diesem Thread.
mfg chmee
p.s.: Man könnte sich auch als Ziel setzen, gemeinsam einen tutorials.de-Bildschirmschoner zu bauen, wie sagt man so schön, eye candy soll er sein. Interessant wären auch vollständige GPU-Umsetzungen in HLSL mit Motionblur etc..

In meiner Signatur ist LBM2, ein kleiner Benchmark mit jenem Thema. Ich möchte aber die Anzahl der Partikel drastisch erhöhen, mehrere 10er Potenzen. Der Benchmark ist in Blitzmax geschrieben, das tut aber nix zur Sache, es geht um jegliche Steigerung der Geschwindigkeit.
bisherige Ideen
- Gleitkomma durch Int ersetzen ohne Verlust der Genauigkeit
- Schleife optimieren
- Grundformel simplifizieren bei gleichem Ergebnis.
- Inline Assembler für schnelle Berechnungen ?
- Engine(Dx oder OGL) benutzen oder direkt in den Speicher schreiben
Code:
' -------------- Auflösung
Global SX:Int=1024
Global SY:Int=768
Global Xmid:Int=SX/2
Global YMid:Int=SY/2
' ---------------- Anzahl Punkte, Multiplikator für die Kräfte und Skalierung bei Darstellung
Global Points:Int=500
Global G:Float=0.1
Global Scaling:Float=0.2
' --------------------------- Arrays für die Punkte
Global xx:Float[Points]
Global yy:Float[Points]
Global Ex:Float[Points]
Global Ey:Float[Points]
Global Fo:Float[Points]
Global Fx:Float[Points]
Global Fy:Float[Points]
' -------------------- Variablen für die Berechnung
Global Winkel:Float
Global Abstand:Float
Global Xf:Float
Global Yf:Float
Global Rad:Float
Global Radx:Float
Global Rady:Float
Global Kra:Float
Global KrP:Float
Punkte initialisieren ( Punkt 0 ist gesondert initialisiert, ich gebe ihm eine besondere Masse, einer Sonne vergleichbar )
Code:
xx[0]=0
yy[0]=0
Fo[0]=200
Fx[0]=0
Fy[0]=0
' --------------- Startwerte der Punkte per Zufall - Besonderheit - per Winkel und Abstand gesetzt
For a=1 To Points-1
Winkel=Rnd(0,360)
Abstand=Rnd(200,380)
xx[a]=Sin(Winkel)*Abstand
yy[a]=Cos(Winkel)*Abstand
Fo[a]=Rnd(1,8)
Fx[a]=-yy[a]*0.3
Fy[a]=xx[a]*0.3
Next
sie sollte wohl für alle Coder sofort klar sein:
Code:
While Not(KeyHit(KEY_SPACE))
Cls
For p=0 To Points-1
' -----------------------Initialwert Bewegungsvektor
Xf=Fx[p]
Yf=Fy[p]
For q=0 To Points-1
If Not(q=p) Then
' ------------------------- horiz und vert. Entfernung
Radx=xx[q]-xx[p]
Rady=yy[q]-yy[p]
' ---------------------------- Pythagoras ohne Wurzel - Entfernung
Rad=Radx*Radx+Rady*Rady
' ----------------------------- Skalarwert der Kraft abh. von Entfernung
Kra=G*Fo[q]*Fo[p]/Rad
KrP=Fo[q]/Fo[p]
' ------------------------------ Addiere zum Bewegungsvektor
Xf:+(Kra*Radx*KrP)
Yf:+(Kra*Rady*KrP)
EndIf
Next
' ------------------------------ Speichere die neue Kraft im Array
Fx[p]=Xf
Fy[p]=Yf
' ------------------------- Verschiebe den Punkt um den Kräftevektor
xx[p]:+Fx[p]
yy[p]:+Fy[p]
' ------------------------- Umrechnen der Weltkoordinaten in ein Bildschirmwert
Plot XMid+xx[p]*Scaling,Ymid+yy[p]*Scaling
' ---------------------------- Wenn Punkt 0 ( Sonne ), male ihn Besonders
If p=0 Then DrawOval XMid+xx[p]*Scaling-3,Ymid+yy[p]*Scaling-3,7,7
Next
' -------------------------- Doublebuffer Flip
Flip
Wend
Alle Ideen sind gerne gehört

mfg chmee
p.s.: Man könnte sich auch als Ziel setzen, gemeinsam einen tutorials.de-Bildschirmschoner zu bauen, wie sagt man so schön, eye candy soll er sein. Interessant wären auch vollständige GPU-Umsetzungen in HLSL mit Motionblur etc..