Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

11

17.06.2003, 22:16

Hi!

Das ist der Grund, warum ich keine verkettete Liste mehr für Partikelsysteme verwende. Nach und nach wird der Heap fragmentiert. Hat man mehrere Listen mit grösseren Objekten und pusht viel rein und löscht wieder usw, dann kann das mit der Heap-Fragmentierung zu einem echten Performance Problem werden. Im Extremfall kanns sogar zu einem Absturz führen.
Wie der Speicher bei einem STL-Vector gehandelt wird, weiss ich nun leider nicht, afaik besteht dort dieses Problem allerdings auch.
Das "idealste" was man machen kann, ist sich nen kleinen Memory-Manager zu schreiben. Dazu legt man einfach fest, wieviele Partikel es maximal geben darf (hatte damit bisher noch keine Probleme, eine maximale Anzahl kann man leicht ermitteln).
Dann macht man ein Array, welches diese maximale Anzahl an Partikeln aufnehmen kann. Ein Partikel hat ja meist einen boolschen Wert, welcher angibt ob der Partikel aktiv ist oder nicht (m_Active). Möchte man nun einen neuen Partikel einfügen, schaut man einfach nach wo der nächste freie Platz ist (m_Active == false) und haut ihn dort rein.
Das hat den Vorteil, dass man immer den gleichen Speicher hat und somit nichts fragmentiert wird. Afaik ist das auch Performancefreundlicher.

cya...TheWanderer
visit: www.poke53280.de

Anonymous

unregistriert

12

17.06.2003, 22:30

Also im Netz gibts dazu echt verdammt viele Tuts..

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

13

17.06.2003, 23:10

@TheWanderer:
Ja, so hatte ich es erst auch gemacht. Diese Methode verwende ich auch sehr oft, mit der speziellen bool-Variable, die sagt, ob das Element benutzt wird oder nicht.

Aber: Beim Partikelsystem habe ich etwas gefunden, was meiner Meinung nach besser ist. Angenommen wir haben die Liste mit den Elementen A, B, C, D, E, F, G, H. Jedes Element ist ein Partikel. Die Reihenfolge sei jetzt mal egal. Nun "stirbt" der Partikel D. Jetzt kopiert man einfach den letzten Partikel (H) dorthin. Die neue Liste heißt: A, B, C, H, E, F, G. Der Vorteil: Es entstehen keine Lücken!
Bei Deiner Methode könnte - theoretisch - so etwas passieren: Erster Partikel existiert, danach kommen 1000 freie Partikel und dann wieder ein existierender. Das heißt man müsste 1000 freie Partikel bei der for-Schleife durchlaufen, und würde immer nur direkt zum nächsten springen.
Bei der von mir beschriebenen Methode gehst Du mit der for-Schleife immer wirklich nur so viele Elemente durch, wie auch existieren. Allerdings entsteht natürlich ein gewisser Aufwand durch das Kopieren von Speicher, aber ich denke, dass es sich durchaus lohnt!

14

17.06.2003, 23:20

Jop für Partikel kann ich nur Array plus DPB empfehlen (Del Push Back). Dadurch wird der Heap nich fragmentiert (weil der freie Partikel ja nich gelöscht sondern nur mit neuen Datengefüllt wird). Dann kann man nämlich noch nen Counter machen und so unter umständen viel Speed rausholen :)

So haben wir das damals in VB gemacht, war relativ schnell ^^ (RELATIV)

*g*

cya

Patrick

Alter Hase

Beiträge: 1 264

Wohnort: Düren

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

15

17.06.2003, 23:40

bitte bitte nicht noch ein Tut über linkedList, die sind doch grauenhaft :( wenn dann nehmt std::list. wer Davids buch hat weiß sowieso dann wie das geht, wers net weis auf Poke gibbet das EINZIG gute Tut zu LinkedList das ich kenne.

bleibt besser bei std::list und std::vector. Was besseres gibt es meiner Meinung nach nicht.

Werbeanzeige