Gravitation Sim optimieren

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

chmee

Betreff: Gravitation Sim optimieren

BeitragSa, Mai 07, 2005 14:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Mahlzeit Allesamt, bin Neuling in BB, aber wollte eh wieder
mit programmieren anfangen. Also hier das erste Werk.

Ich kriege die Sim auf 700Pixel/8Blur bei 1024/768/16 Fullscreen.
Dann läufts noch einigermaßen flüssig. Das Ziel ist aber mind.
das 10fache..Nächster Schritt wäre nach C++ portieren, um
irgendwas in den 6stelligen Bereichen in Echtzeit zu zaubern.

Mein PC: 2800+/1GB/GFMX4Onboard

Dinge, wo Ihr mir helfen könntet:
1. Geschwindigkeitsoptimierung
2. Echtes Blur ( Hardware oder Proggen ?)



BlitzBasic: [AUSKLAPPEN]
; ---------------------------------------
; -- Gravitation Sim v 0.4c --
; -- geschrieben:chmee@phreekz.de 2005 --
; ---------------------------------------
Const anz=700
Const blur=4 ; zwischen 2 und 16

Const xmax=800
Const ymax=600

Const Mitte=0 ; Statische Kraft ? 0/1
is=10 ; Initial Geschwindigkeit
imn=10 ; Masse Mimimum
imx=60 ; masse Maximum


Dim x#(anz),y#(anz),dx#(anz),dy#(anz),mass#(anz)
Dim blurpix(1,blur,anz)
SeedRnd MilliSecs()
Const xmid=xmax/2
Const ymid=ymax/2
Graphics xmax,ymax,16,0

ima=Int(0.035*imx)
imb=Int(0.085*imx)

.Start
xini=Rnd(25,xmid-10) ; Initial X
yini=Rnd(25,ymid-10) ; Initial Y

; ---------- Statische Gravitationskraft
x#(0)=0
y#(0)=0
mass#(0)=2000
;----------------------------------------------
tast=\"\"
buf=0
Mit=1-Mitte
; Initialisieren der Punkte
For an=1 To anz
x#(an)=Rnd(-xini,xini)
y#(an)=Rnd(-yini,yini)
dx#(an)=Rnd(-is,is)/10
dy#(an)=Rnd(-is,is)/10
mass#(an)=Rnd(imn,imx)/10
Next

SetBuffer BackBuffer()
While Not (tast Or mou)
tast=GetKey()
mou=GetMouse()
LockBuffer BackBuffer()
For an=1 To anz
dxx#=0
dyy#=0
For in=Mit To anz ; Kraft pro Punkt berechnen
If an<>in Then ; Nicht mit sich selbst, da div0-Error
xu#=x#(an)-x#(in)
yu#=y#(an)-y#(in)
entf#=Sqr((xu#*xu#)+(yu#*yu#)) * 20
dxx#=dxx#-xu#*mass#(in)/entf# ; -- vektorKomponente X * Masse / Entfernung
dyy#=dyy#-yu#*mass#(in)/entf#
EndIf
Next
dx#(an)=dx#(an)+dxx#/anz/2 ; Richtungsvektor dx und dy
dy#(an)=dy#(an)+dyy#/anz/2
x#(an)=x#(an)+dx#(an)
y#(an)=y#(an)+dy#(an)
xxx=xmid+Int(x#(an))
yyy=ymid+Int(y#(an))
If xxx>xmax Or xxx<0 Then dx#(an)=-dx#(an) ; Wenn an Wände gestoßen, Kräfte dx/dy umkehren
If yyy>ymax Or yyy<0 Then dy#(an)=-dy#(an)
buf=1-buf
For zahl=1 To blur
blurpix(0,zahl-1,an)=blurpix(0,zahl,an)
blurpix(1,zahl-1,an)=blurpix(1,zahl,an)
Next
blurpix(0,blur,an)=xxx
blurpix(1,blur,an)=yyy
For zahl=1 To blur
If zahl<>blur Then colo=127/(blur-zahl)
xpix=blurpix(0,zahl,an)
ypix=blurpix(1,zahl,an)
If xpix<xmax And xpix>0 And ypix<ymax And ypix>0 Then
mad=mass#(an)
rgb=ReadPixelFast(xpix,ypix)
rgb=rgb+(mad>ima)*(colo)*$10000+(mad>ima And mad<imb)*(colo)*$100+(mad=<ima Or mad>imb)*colo
If rgb>$FFFFFF rgb=$FFFFFF
WritePixelFast xpix,ypix,rgb,BackBuffer()
EndIf
Next
Next
UnlockBuffer BackBuffer()
Flip
Cls
Wend
If tast=32 Then Goto start


Danke im voraus für Meinung, Kritik und Hilfe..

mfg chmee
Das Leben könnte so schön bunt sein, aber nee....
 

chmee

BeitragSa, Mai 07, 2005 15:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Habe eben noch die Gravitationsformel verbessert, da die
benutzte gut aussieht, aber physikalisch falsch ist.

Denn-->
F=G*m1*m2/Entf^2

Damit ist ( da quadrat rausgenommen ) die Sache n bissel schneller
geworden..

Wie kann man das Floating Zeuges in Int umwandeln ?
Einfach Werte mal 1000 berechnen und erst bei Bildschirm-
ausgabe in Floating umwandeln ?

BlitzBasic: [AUSKLAPPEN]
; ---------------------------------------
; -- Gravitation Sim v 0.4d --
; -- geschrieben:chmee@phreekz.de 2005 --
; ---------------------------------------
Const anz=800
Const blur=2 ; zwischen 2 und 16

Const xmax=1024
Const ymax=768

Const Gravkonst#=0.9
Const Mitte=0 ; Statische Kraft ? 0/1
is=25 ; Initial Geschwindigkeit
imn=10 ; Masse Mimimum
imx=100 ; masse Maximum


Dim x#(anz),y#(anz),dx#(anz),dy#(anz),mass#(anz)
Dim blurpix(1,blur,anz)
SeedRnd MilliSecs()
Const xmid=xmax/2
Const ymid=ymax/2
Graphics xmax,ymax,16,0

ima=Int(0.035*imx)
imb=Int(0.085*imx)

.Start
xini=Rnd(25,xmid-10) ; Initial X
yini=Rnd(25,ymid-10) ; Initial Y

; ---------- Statische Gravitationskraft
x#(0)=0
y#(0)=0
mass#(0)=200
;----------------------------------------------
tast=\"\"
buf=0
Mit=1-Mitte
; Initialisieren der Punkte
For an=1 To anz
x#(an)=Rnd(-xini,xini)
y#(an)=Rnd(-yini,yini)
dx#(an)=Rnd(-is,is)/10
dy#(an)=Rnd(-is,is)/10
mass#(an)=Rnd(imn,imx)/10
Next

SetBuffer BackBuffer()
While Not (tast Or mou)
tast=GetKey()
mou=GetMouse()
LockBuffer BackBuffer()
For an=1 To anz
dxx#=0
dyy#=0
For in=Mit To anz ; Kraft pro Punkt berechnen
If an<>in Then ; Nicht mit sich selbst, da div0-Error
xu#=x#(an)-x#(in)
yu#=y#(an)-y#(in)
entf#=(xu#*xu#)+(yu#*yu#)
komp#=gravkonst#*mass#(in)*mass#(an)/entf# ; Entf N quadsch > Wurzel entfernt bei Entf#
dxx#=dxx#-xu#*komp# ; -- X * Konst * Masse1 * Masse2 / Entfernung^2
dyy#=dyy#-yu#*komp#
EndIf
Next
dx#(an)=dx#(an)+dxx#/anz/2 ; Richtungsvektor dx und dy
dy#(an)=dy#(an)+dyy#/anz/2
x#(an)=x#(an)+dx#(an)
y#(an)=y#(an)+dy#(an)
xxx=xmid+Int(x#(an))
yyy=ymid+Int(y#(an))
If xxx>xmax Or xxx<0 Then dx#(an)=-dx#(an)/2 ; Wenn an Wände gestoßen, Kräfte dx/dy umkehren
If yyy>ymax Or yyy<0 Then dy#(an)=-dy#(an)/2
buf=1-buf
For zahl=1 To blur
blurpix(0,zahl-1,an)=blurpix(0,zahl,an)
blurpix(1,zahl-1,an)=blurpix(1,zahl,an)
Next
blurpix(0,blur,an)=xxx
blurpix(1,blur,an)=yyy
For zahl=1 To blur
If zahl<>blur Then colo=96/(blur-zahl)
xpix=blurpix(0,zahl,an)
ypix=blurpix(1,zahl,an)
If xpix<xmax And xpix>0 And ypix<ymax And ypix>0 Then
mad=mass#(an)
rgb=ReadPixelFast(xpix,ypix)
rgb=rgb+(mad>ima)*(colo)*$10000+(mad>ima And mad<imb)*(colo)*$100+(mad=<ima Or mad>imb)*colo
If rgb>$FFFFFF rgb=$FFFFFF
WritePixelFast xpix,ypix,rgb,BackBuffer()
EndIf
Next
Next
UnlockBuffer BackBuffer()
Flip
Cls
Wend
If tast=32 Then Goto start


mfg chmee
Das Leben könnte so schön bunt sein, aber nee....
 

chmee

BeitragSa, Mai 07, 2005 16:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Folgende weitere Frage:

Anstatt mit gespeicherten BlurPixeln ( siehe oben ) würde ich gerne Faden
lassen.

Gibt es irgendwelche BitBlt Befehle, die man mit Bänken ausführen kann ?
Oder anders:

1. Ich erstelle eine Screenbank die gefüllt ist mit $050505, also Dunkelgrau.
2. Ich ziehe vom Screen diese Bank ab, hätte somit einen Blur, abh.
von der Helligkeit der Screenbank und ich bräuchte nicht mehr mit
Buffering arbeiten ..

mfg chmee
Das Leben könnte so schön bunt sein, aber nee....

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group