Optimierung: 1500 Partikel ~8ms Rechenzeit

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

Xaymar

ehemals "Cgamer"

Betreff: Optimierung: 1500 Partikel ~8ms Rechenzeit

BeitragMi, Feb 04, 2009 20:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi

Ich habe nun diese funktion(für mein ParticleSystem). Sie kommmt mir sehr unoptimiert vor. DEshalb ne frage an euch was kannn ich noch optimieren?
Code: [AUSKLAPPEN]
Function UpdateParticles(Cam)
   Local Perc#,TMovDir#,TMovSpe#,Red,Gre,Blu
   
   Zeit# = MilliSecs()
   GetDelta()
   For P.Particle = Each Particle
      P\Msec = MilliSecs()-P\SMsec
      If P\Msec > P\Lifetime
         FreeEntity P\Spr
         Delete P.Particle
         ParticleCount = ParticleCount - 1
      Else
         Perc# = P\Msec / Float(P\Lifetime)

         If EntityInView(P\Spr, Cam) = 1
            ;Alpha
            If P\AAl# < P\EAl#
               EntityAlpha P\Spr, (P\AAl# + (P\EAl# - P\AAl#)*Perc#)
            ElseIf P\AAl# > P\EAl#
               EntityAlpha P\Spr, P\EAl# + (P\AAl - (P\EAl# + (P\AAl# - P\EAl#)*Perc#))
            EndIf
         
            ;Color
            Red = P\ACR:Gre = P\ACG:Blu = P\ACB
            If P\ACR < P\ECR
               Red = P\ACR - (P\ACR - P\ECR) * Perc#
            ElseIf P\ACR > P\ECR
               Red = P\ACR + (P\ECR - P\ACR) * Perc#
            EndIf
            If P\ACG < P\ECG
               Gre = P\ACG - (P\ACG - P\ECG) * Perc#
            ElseIf P\ACG > P\ECG
               Gre = P\ACG + (P\ECG - P\ACG) * Perc#
            EndIf
            If P\ACB < P\ECB
               Blu = P\ACB - (P\ACB - P\ECB) * Perc#
            ElseIf P\ACB > P\ECB
               Blu = P\ACB + (P\ECB - P\ACB) * Perc#
            EndIf
            EntityColor P\Spr, Red, Gre, Blu
            
            ;Scaling
            If 1/P\CScale# <> "Infinity" ScaleEntity P\Spr, 1/P\CScale#, 1/P\CScale#, 1/P\CScale#
            If P\AScale# < P\EScale#
               P\CScale# = P\AScale# - (P\AScale# - P\EScale#) * Perc#
            ElseIf P\AScale# > P\EScale#
               P\CScale# = P\AScale# + (P\EScale# - P\AScale#) * Perc#
            EndIf
            ScaleEntity P\Spr, P\CScale#, P\CScale#, P\CScale#
            
            ;Rotating
            If P\ARot < P\ERot
               RotateEntity P\Spr, 0, 0, P\ARot + (P\ARot - P\ERot) * Perc#
            ElseIf P\ARot > P\ERot
               RotateEntity P\Spr, 0, 0, P\ARot - (P\ERot - P\ARot) * Perc#
            EndIf
            WorkingCount = WorkingCount + 1
         EndIf
         
         
         ;Movement
         TMovDir# = P\AMovDir:TMovSpe# = P\AMovSpe#
         If P\AMovDir# < P\EMovDir#
            TMovDir# = P\AMovDir# - (P\AMovDir# - P\EMovDir#) * Perc#
         ElseIf P\AMovDir# > P\EMovDir#
            TMovDir# = P\AMovDir# + (P\EMovDir# - P\AMovDir#) * Perc#
         EndIf
         If P\AMovSpe# < P\EMovSpe#
            TMovSpe# = P\AMovSpe# - (P\AMovSpe# - P\EMovSpe#) * Perc#
         ElseIf P\AMovSpe# > P\EMovSpe#
            TMovSpe# = P\AMovSpe# + (P\EMovSpe# - P\AMovSpe#) * Perc#
         EndIf
         TranslateEntity P\Spr, (Cos(TMovDir#)*TMovSpe#)*DeltaT#, (Sin(TMovDir#)*TMovSpe#)*DeltaT#, 0.0005
      EndIf
   Next
End Function
Warbseite

aMul

Sieger des Minimalist Compo 01/13

BeitragMi, Feb 04, 2009 21:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich steige durch deinen Code dank unglaublich übersichtlicher Variablennamen absolut nicht durch.
Aber wozu brauchst du die ganzen Ifs?
Es scheint mir, dass du die Sachen auch mit den normalen mathematischen Funktionen lösen könntest.

Abs zum Beispiel könnte dir helfen, wenn ich deine Zeilen richtig verstanden habe.
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans!
Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver

Xaymar

ehemals "Cgamer"

BeitragMi, Feb 04, 2009 21:56
Antworten mit Zitat
Benutzer-Profile anzeigen
also könnte ich
Code: [AUSKLAPPEN]
            If P\AAl# < P\EAl#
               EntityAlpha P\Spr, (P\AAl# + (P\EAl# - P\AAl#)*Perc#)
            ElseIf P\AAl# > P\EAl#
               EntityAlpha P\Spr, P\EAl# + (P\AAl - (P\EAl# + (P\AAl# - P\EAl#)*Perc#))
            EndIf


durch
Code: [AUSKLAPPEN]
            EntityAlpha P\Spr, (P\AAl# + (PEAl# - PAAl#) * Perc#)

ersetzen?

achja Variablen namen
Zitat:
ACR - AnfangColorRed
ECR - EndeColorRed
AAl# - AnfangAlpha#
EAl# - EndeAlpha#
ARot - AnfangRotation
ERot - EndRotation
MovDir - MoveDirection
MovSpe# - MoveSpeed#
usw


[edit]Was mir grade noch eingefallen ist: Cos und Sin durch Dims ersetzen
Warbseite

coolo

BeitragMi, Feb 04, 2009 23:24
Antworten mit Zitat
Benutzer-Profile anzeigen
@aMul: Meistens sind If-abfragen schneller als komplizierte Berechnungen.

Achja: Noch ein kleiner Optimierungstrick: Wie wärs wenn du Millisecs() am Anfang in eine Variable speicherst, dann wird es nicht andauernd ausgeführt.
http://programming-with-design.at/ <-- Der Preis ist heiß!
That's no bug, that's my project!
"Eigenzitate sind nur was für Deppen" -Eigenzitat

aMul

Sieger des Minimalist Compo 01/13

BeitragMi, Feb 04, 2009 23:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, If ist sicher schneller als eine komplizierte Berechnung, allerdings finde ich davon eine im gezeigten Code.

Ansonsten:
Sin() und Cos() durch Arrays ersetzen macht so gut wie keinen Sinn, der Geschwindigkeitsschub ist minimal, zumindest, wenn man noch ein Mod mit einbaut.
Außerdem muss man dann auf Genauigkeit verzichten(sollte man keine riesigen Arrays benutzen wollen).

Zu der Frage ob man den ganzen Block durch die eine Zeile ersetzen kann muss ich eine Gegenfrage stellen:
Hast du in der Schule nicht gelernt wie man Terme umformt und vereinfacht?
Gerade wo es hier nur um Addition (und begrenzt Multiplikation) geht sollte das jeder der sich anmaßt programmieren zu wollen im Schlaf können(meine persönliche Meinung).

Aber ja, du hast recht. Die beiden Terme sind äquivalent.
Somit kannst du dir sogar ohne zusätzliche Funktionen mehr als die Hälfte deines Codes sparen.
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans!
Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver

Noobody

BeitragMi, Feb 04, 2009 23:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Ausserdem würde ich auf EntityInView verzichten, was wohl die grösste Bremse sein wird.
Benutze eine schnellere Berechnung mit RectsOverlap.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

Xaymar

ehemals "Cgamer"

BeitragDo, Feb 05, 2009 9:28
Antworten mit Zitat
Benutzer-Profile anzeigen
@Noobody: die 0.000012ms machens nu auch nich... aber ich kanns ja mal versuchen, hast du ein beispiel für sowas?

@aMul: naja nicht wirklich... zum Beispiel die Geschwindigkeit kann auch ins minus gehen, daher die ganzen if abfragen. und was abs angeht: 99% Prozessorverbrauch Sad
Warbseite

Jan_

Ehemaliger Admin

BeitragDo, Feb 05, 2009 10:34
Antworten mit Zitat
Benutzer-Profile anzeigen
das scaleentity und rotateentity kannste noch mit in die If/elseif abfragen nehmen.
Sowie das translateentity
between angels and insects

Xaymar

ehemals "Cgamer"

BeitragDo, Feb 05, 2009 11:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für die antworten bin nun bei ~5ms Rechenzeit.
Das mit RectsOverlap funzt auch gut.(auch wenn Point in Rect gereicht hätte Smile )
Warbseite

Jan_

Ehemaliger Admin

BeitragDo, Feb 05, 2009 11:30
Antworten mit Zitat
Benutzer-Profile anzeigen
weiterhin, solltest du eigentlich für ein Partikelsystem eine Singlesurfaceengine nehmen.
between angels and insects

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group