Partikel, Programm wird zu langsam

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

count-doku

Betreff: Partikel, Programm wird zu langsam

BeitragSa, Mai 01, 2010 14:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

ich habe mal versucht eine 2D Partikellib zu schreiben.
Allerdings gehen die FPS sehr schnell in die Knie.
Deswegen wollte ich mal fragen, ob ich geschwindigkeits technisch noch was verbessern kann.
Code BlitzBasic: [AUSKLAPPEN]
;Partikel test
Graphics 800,600,32,6;Grafik setzen
SetBuffer BackBuffer()
SeedRnd MilliSecs()

Type TEmittor;Type für den Emittor
Field x,y,min_winkel#,max_winkel#,time#,akt_time#,parts_per_activation,max_life,min_life,min_color,max_color
;mit x,y Position ; Abstrahlwinkel ; Zeit bis zur nächsten Partikelemission ; aktuelle Zeit
;Partikel pro Emmision ; Leben der Partikel ; Farbbereich
End Type
Type TParticle;Type für die Partikel
Field x,y,winkel#,life,Color
;mit x,y Position ; Winkel ; Leben ; Farbe
End Type

Local Emittor1.TEmittor=CreateEmittor(400,300,0,360,1,3,1,100,5050532);Ein paar Beispiel Emitter
Local Emittor2.TEmittor=CreateEmittor(200,200,0,180,1,3,15,5,3005532)
Local Emittor3.TEmittor=CreateEmittor(300,300,0,270,1,3,15,5,6543182)
Local Emittor4.TEmittor=CreateEmittor(400,400,0,360,1,3,15,5,8154348)

Global Particles;Anzahl der Partikel

Local fps#,FPS_LAST#;FPS zählen
Local timer=CreateTimer(60);Timer
While KeyHit(1)=0

Cls
If KeyDown(57);Auf Leertaste an Mausposition 5Partikel erzeugen
For k=1 To 5
CreateParticle(MouseX(),MouseY(),Rnd(0,360),100,600500)
Next
End If
UpdateEmittors();Alle Emittor aktualisieren
UpdateParticles();alle Partikel aktualisieren

Text 1,600-30,Particles+" Partikel";Partikel anzahl anzeigen
fps#=(19*fps#+(1000./(MilliSecs()-FPS_LAST)))/20.:FPS_LAST=MilliSecs();FPS zählen
Text 1,600-15,fps#+" FPS";FPS anzeigen#
WaitTimer timer
Flip 0
Wend
End

;Neuen Emittor erzeugen
Function CreateEmittor.TEmittor(x,y, min_winkel#,max_winkel#,time,parts_activation, min_life,max_life,min_color, max_color$="NOT")
Local e.TEmittor=New TEmittor
e\x=x
e\y=y
e\min_winkel=min_winkel
e\max_winkel=max_winkel
e\time=time
e\parts_per_activation=parts_activation
e\max_life=max_life
e\min_life=min_life
If max_color<>"NOT"
e\max_color=max_color
Else
e\max_color=min_color
End If
e\min_color=min_color
Return e
End Function
Function CreateParticle.TParticle(x,y,winkel#,life,farbe);Neuer Partikel
Local p.TParticle=New TParticle
p\x=x
p\y=y
p\winkel=winkel
p\life=life
p\Color=farbe
Particles=Particles+1
Return p
End Function
Function UpdateEmittors()
Local e.TEmittor
For e.TEmittor=Each TEmittor;alle Emittor durchgehen
If MilliSecs()>e\time+e\akt_time;Wenn es wieder Zeit ist neue Partikel auszugeben
For k=1 To e\parts_per_activation;Partikel ausgeben
CreateParticle(e\x,e\y,Rnd#(e\min_winkel#,e\max_winkel#),Rand(e\min_life,e\max_life),Rand(e\max_color,e\max_color))
Next
e\akt_time=MilliSecs()
End If
Next
End Function
Function UpdateParticles()
Local p.TParticle
For p.TParticle=Each TParticle;alle Partikel durchgehen
If p\life>0 And (p\x>1 And p\x<799) And (p\y>1 And p\y<598);Wenn sie noch aufm Bildschirm sind und Leben>0 ist
p\x = p\x + Cos#(p\winkel#)*-2;Neue Position errechnen
p\y = p\y + Sin#(p\winkel#)*2
LockBuffer BackBuffer()
WritePixelFast p\x,p\y,p\Color;Partikel zeichenen
UnlockBuffer BackBuffer()
p\life=p\life-1
Else;Wenn nicht, dann löschen
Delete p.TParticle
Particles=Particles-1
End If
Next
End Function


mfg,
count-doku

Xeres

Moderator

BeitragSa, Mai 01, 2010 14:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du den Buffer für jeden Pixel Lockst/Unlockst ist der Geschwindigkeitsvorteil vermutlich plusminus 0.
Locken, Alle Pixel durchgehen, Unlocken.
Ansonsten geht's in nur in 3D noch wesentlich schneller.
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Nicdel

BeitragSa, Mai 01, 2010 14:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Mach das LockBuffer vor die Partikelschleife und das UnlockBuffer danach:

Code: [AUSKLAPPEN]

LockBuffer
For p.Partikel = each Partikel
next
UnLockBuffer


Edit: Zu spääät.
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7

mpmxyz

BeitragSa, Mai 01, 2010 14:28
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzBasic: [AUSKLAPPEN]
			LockBuffer BackBuffer()
WritePixelFast p\x,p\y,p\Color;Partikel zeichenen
UnlockBuffer BackBuffer()

Ich denke, dass das Zeichen am längsten braucht.
Hier lässt sich nämlich einiges optimieren, indem LockBuffer und UnlockBuffer außerhalb der Schleife landen.
mfG
mpmxyz
Edit: Der Fehler ist anscheinend ziemlich eindeutig...
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

count-doku

BeitragSa, Mai 01, 2010 14:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke!
Jetzt läuft es konstant mit 60FPS.


mfg,
count-doku

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group