Optimierung: 1500 Partikel ~8ms Rechenzeit
Übersicht

![]() |
Xaymarehemals "Cgamer"Betreff: Optimierung: 1500 Partikel ~8ms Rechenzeit |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
aMulSieger des Minimalist Compo 01/13 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
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 |
![]() |
Xaymarehemals "Cgamer" |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@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 |
![]() |
aMulSieger des Minimalist Compo 01/13 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
Xaymarehemals "Cgamer" |
![]() Antworten mit Zitat ![]() |
---|---|---|
@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 ![]() |
||
Warbseite |
![]() |
Jan_Ehemaliger Admin |
![]() Antworten mit Zitat ![]() |
---|---|---|
das scaleentity und rotateentity kannste noch mit in die If/elseif abfragen nehmen.
Sowie das translateentity |
||
between angels and insects |
![]() |
Xaymarehemals "Cgamer" |
![]() Antworten mit Zitat ![]() |
---|---|---|
Danke für die antworten bin nun bei ~5ms Rechenzeit.
Das mit RectsOverlap funzt auch gut.(auch wenn Point in Rect gereicht hätte ![]() |
||
Warbseite |
![]() |
Jan_Ehemaliger Admin |
![]() Antworten mit Zitat ![]() |
---|---|---|
weiterhin, solltest du eigentlich für ein Partikelsystem eine Singlesurfaceengine nehmen. | ||
between angels and insects |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group