Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Jul 10, 2025 20:00

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: GetMem&co bremst unheimlich
BeitragVerfasst: Mi Aug 02, 2006 11:27 
Offline
DGL Member
Benutzeravatar

Registriert: So Okt 26, 2003 20:07
Beiträge: 249
Hey,

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...

Derzeitiges Projekt:
FireBlade Particle Engine (Release R2 2009.06.29)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 02, 2006 12:06 
Offline
DGL Member
Benutzeravatar

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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 02, 2006 13:03 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 02, 2006 13:16 
Offline
DGL Member
Benutzeravatar

Registriert: So Okt 26, 2003 20:07
Beiträge: 249
Lossy eX hat geschrieben:
Von was für Partikelmengen reden wir hier?


von mehreren tausend

Lossy eX hat geschrieben:
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...

Derzeitiges Projekt:
FireBlade Particle Engine (Release R2 2009.06.29)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 02, 2006 13:44 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
Probier mal http://sourceforge.net/projects/fastmm, der sollte das ganze leicht beschleunigen.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.007s | 14 Queries | GZIP : On ]