Partickelcode
-
Warum überhaupt Partikel sortieren? Und wonach? Ich bin mir recht sicher, dass jegliche Sortiererei die Performance nur schwächt und sie nicht erhöht.
-
Wie wäre es, wenn man einmal eine Liste von Partikeln und einmal eine
Liste von Pointern auf ungenutze Partikel hätte?Wenn man mehr P. braucht als da/frei sind, erzeugt man halt noch ein paar.
Stirbt ein P. löscht man ihn nicht aus dem Speicher, sondern fügt seinen
Pointer in die "Leichen"-Liste hinzu.
Wenn man dann wieder ein paar Partikel braucht, checkt man erst die Leichen-Liste.
-
naja... hast schon recht, dass zum Teil dynamische Sachen besser sind. Aber ich hab ja auch nichts anderes behauptet.... Nur dass das halt eher Ausnahmefälle sind. Ich glaube die wenigsten brauchen so komplexe Partikel. Normalerweise reichen halt die Arrayteile.
Trotzdem kann ich mir auch nicht vorstellen, dass das mit sortieren etc. am Ende wirklich schneller läuft...
-
@Kane: Ob das wirklich nötig ist? Man kann während man die Liste der Partikel durchgeht, um sie zu rendern oder zu bewegen, sich schon merken, wo der erste freie Partikel ist, oder wo überhaupt aktive Partikel sind. Da kann man sich beim nächsten Partikel schon die Suche sparen. Ich glaube so eine Extraliste für "Leichen" würde auch schon einiges an Aufwand bedeuten. Man muss ja aus dieser Liste auch was löschen können und dann haben wir das gleiche Problem wieder.
-
Die Leute sind eben alle einfach zu doof 'ne verkette Liste zu benutzen und nehmen deswegen immer Arrays. Die haben halt noch nie über die Performance nachgedacht, geschweige denn das mal probiert und verglichen. Die müsste man echt alle mal zum ZFX schicken ;).
-
Hi,
wenn man sein Array mit Partikeln durchläuft und dabei einen entdeckt, der seine Lebenszeit beendet hat, dann kopiert man den letzten Eintrag des Arrays an diese Position und reduziert den Zähler. Kein Aufwand für dynamisches Speichermanagement, keine Extralisten usw.
for (blablablupp) { if (pPartikel[i].fLife <= 0.0f) { if (i==(m_iPartikels-1)) { m_iPartikels--; } else { pPartikel[i] = pPartikel[m_iPartikels-1]; m_iPartikels--; i--; } } else { // update / render partikel i } }
Ciao,
Stefan[ Dieser Beitrag wurde am 05.05.2003 um 11:21 Uhr von Stefan Zerbst editiert. ]
-
Jo, so hab ich's auch gemacht
-
@Stefan Zerbst
Das ist eine gute Idee, aber:pPartikel[i] = pPartikel[m_iPartikels-1];
Aber braucht das nicht viel Zeit ein Partickel zu kopieren?
Ein Partickel besteht ja schon mindestens allein aus 7 Zahlen(3×Ort und 3×Geschwindigkeit, Lebenszeit) und zusätzlich noch die anderen Werte.Dagegen geht das Löschen doch schneller? Man muß nur
1)Vorgänger auf Nachfolger verlinken
2)Nachfolger auf Vorgänger verlinken
3)Den Speicher den das Partickel einnahm als freigeben erklären.
---Okay vielleicht sollte man mal eine grundlegende Frage klären.
Wie lange dauert das Speichererstellen/freigeben im Vergleich zu einer Zuweisung? hat da wer eine Ahnung[ Dieser Beitrag wurde am 07.05.2003 um 17:47 Uhr von Janko editiert. ]
-
Original erstellt von Janko:
PartickelKannst du nicht die korrekte Schreibweise benutzen?! Ich muss da immer an Pickel denken!
-
Lol klar
"Partikel"
-
Nicht löschen, in die Leichen-Liste(bzw. Liste von Pointer auf Leichen) damit.
-
man kann jetzt so lang darüber diskutieren wie vile es kostet partikel zu verscheiben und so. aber hauptargument gegen listen ist in meien augen das es länger geht eine liste zu durchlaufen als ein array weils einfach aufwendiger ist... und das durchlaufen der liste muss ja ziemlich oft geschehen...
-
Hi,
das ständige dynamische Allokieren und Deallokieren von Speicher würde ich nie zur Laufzeit vorziehen. Natürlich kann das Kopieren eines Partikels auch Zeit kosten aber eine Liste linearen Speichers kann schneller durchlaufen werden (weiterschieben des Pointers statt [ i ] Zugriff) als eine verkettete Liste.
Am sinnvollsten ist sicherlich eine verkettete Liste auf einem statischen Speicher, was aber wieder eine eigene Klassenimplementierung voraussetzt.
Für einfache Programme ist die Array Version vorzuziehen, da man keinerlei Setup-Aufwand hat.
Ciao,
Stefan
-
...nach dem wir Unreal nachprogrammiert hatten kümmerten wir uns um optimierte Partikelsysteme.
-
Original erstellt von Stefan Zerbst:
**eine Liste linearen Speichers kann schneller durchlaufen werden (weiterschieben des Pointers statt [ i ] Zugriff) als eine verkettete Liste.
**
-
er meint wohl vector
-
jetzt versteh ich es noch weniger. Ich glaub ich weiss was er meint, dass man schneller durch einen Vector iterieren kann, als durch eine verkettete Liste.
Aber was hat es mit dem [i] aufsich