bin immernoch wegen einem bestimmten Problem an FireBlade am tüfteln.
Hab die Lösung eigentich gefunden, allerdings sind GetMem und AllocMem scheinbar extrem langsam und in Echtzeit quasi nicht zu gebrauchen.
Problematisch ist es bisher, dass sich die Reihenfolge beim Rendern der Partikel ändert, wodurch beim rendern über non-additive Methoden seltsame "Effekte" erscheinen (Partikel tauchen auf und verschwinden wieder [logischerweise]).
Mein Lösungsansatz ist eine verkettete Liste. Damit sich das Handling nicht wieder Grundlegend verändert, werden die Pointer zu den einzelnen Knoten nach wie vor in einem Array gespeichert. Ein Knoten ist ein Record, für den ich jeweils immer Speicher mit obigen Methoden anfordere.
Es funktioniert prima, allerdings ist es eben vor allem bei größeren Partikelmengen ungeheuer langsam.
Das wundert mich etwas, denn die SetLength Methode ist ja auch sehr schnell, und die dürfte im Prinzip ja nichts anderes machen.
Ich kann deswegen kein Array benutzen, weil sich die Adresse verständlicherweise nach jedem SetLength wieder ändert.
Gibt es eine Methode, womit ich den gleichen Effekt (gleichbleibende Reihenfolge) ohne Geschwindigkeitsverlust erreiche?
gruß
_________________ I'm not the signature, I'm just cleaning the floor...
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Also ich habe bisher schon häufig mit verketteten Listen gearbeitet und kaum große Probleme gehabt. Allerdings muss ich gestehen, dass ich deine Architektur nicht verstanden habe.
Von was für Partikelmengen reden wir hier?
Normal würde ich es so gestalten, dass ich die Partikel erzeuge sobald sie zum Leben erwachen und wieder entferne, wenn sie tot sind. Dazwischen würden sie immer existieren und ich würde mit deren Pointern rumhantieren. Denke mal, dass du es so oder so ähnlich machst. Allerdings wundert es mich, dass du so häufig GetMem aufrufen musst.
SetLength ruft intern auch nur GetMem auf. Allerdings nur ein mal. Sonst realloc. Aber das auch nur ein mal.
Anstelle die Partikel zu löschen kann man die Zeiger auf die freien Partikel in einem Stack zwischenspeichern und nur dann mit getmem neuen Speichern belegen wenn der Stack leer ist.
Normal würde ich es so gestalten, dass ich die Partikel erzeuge sobald sie zum Leben erwachen und wieder entferne, wenn sie tot sind. Dazwischen würden sie immer existieren und ich würde mit deren Pointern rumhantieren. Denke mal, dass du es so oder so ähnlich machst. Allerdings wundert es mich, dass du so häufig GetMem aufrufen musst.
ich mache es genau so. im prinzip rufe ich getmem nicht dauernd auf, sondern immer, wenn man ein neues partikel hinzufügt. problematisch wird es eben am anfang, wenn ich die partikel alle hinzufüge. das dauert schonmal nen paar sekunden. wenn dann alle partikel die gleiche lebensdauer haben, kommt das püroblem wieder. wie langsam freemem ist, habe ich noch nicht probiert.
Lossy eX hat geschrieben:
SetLength ruft intern auch nur GetMem auf. Allerdings nur ein mal. Sonst realloc. Aber das auch nur ein mal.
setlength habe ich genauso häufig aufgerufen, wie getmem.
LarsMiddendorf hat geschrieben:
Anstelle die Partikel zu löschen kann man die Zeiger auf die freien Partikel in einem Stack zwischenspeichern und nur dann mit getmem neuen Speichern belegen wenn der Stack leer ist.
was u.U zu einem massiven Speichergebrauch führen würde. allerdings sicher eine überlegung wert, man müsstes ausprobieren. bliebe allerdings immernoch das problem am anfang
gruß
edit: was die adresse vom array angeht habe ich mich wohl getäuscht - ich denke, ich werde ich werds nochmal mit arrays in kombination mit LarsMiddendorfs idee versuchen.
_________________ I'm not the signature, I'm just cleaning the floor...
Mitglieder in diesem Forum: 0 Mitglieder und 8 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.