Registriert: Sa Nov 02, 2002 18:06 Beiträge: 299 Wohnort: Dresden
Jetzt wo ich vor kurzen das erste Problem meines BSP-Baum gelöst hab, hab ich ein neues: Wenn ich in den Typen TGLNode etwas neues hinzufüge, bricht auf einmal das ganze Prog zusammen (EAccesViolation). Wenn ichs aber wieder weg mache gehts wieder. Zu hoher speicherverbrauch. Woran liegt das. Hab den Code mal hochgeladen.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
_________________ "Ich würde ja gern die Welt verändern, aber Gott gibt mir den Quelltext nicht"
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Also eine AccessViolation hat nicht unbedingt etwas mit zu wenig Speicher zu tun.
Ein AV bekommst du immer dann wenn du versuchst auf Speicher zuzugreifen der nicht Gültig ist. Also schon freigegeben, nicht reserviert oder einfach nur ein falscher Pointer. Also solltest du dir mal ganau anschauen was du machst.
PS: Evtl wäre es irgenwann mal ganz sinnvoll aus den Records Klassen zu machen. Also ein Objektmodel daraus machen. Weil das ja anscheinend immer komplexer wird.
PPS: Kommt der Fehler denn schon sobald du Zeile 53 auskommentierst?
Du solltest evtl auch das Packed bei den Records wegmachen. Wobei ich bezweifele das es daran liegt aber dadurch könntest du auch noch mehr Geschwindigkeit bekommen. Das Packed wird hauptsächlich nur verwendet wenn man Record DIREKT aus einer Datei lesen möchte.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Die Methoden darf man natürlich auch nicht vergessen. Die liegen logischerweise als Bytecode im Speicher. Aber für jede Klasse nur einmal. Also alle Instanzen der Klasse benutzen die selben Methoden. Aber die Methoden hast du ja so oder so. Also kannste den Faktor schon praktisch vergessen.
Aber zu deinem Problem. Zu groß kann es eigentlich nicht sein. Das wäre jedenfalls das erste Mal das ich von so etwas höre.
Wenn ich mich recht entsinne hast du bei dem Portal kein packed dabei stehen. Evtl kommt er dabei intern mit seinen Rechnungen durcheinnader. Mach mal bei dem Portal das packed dazu oder (eigentlich besser) bei allen anderen records weg. Das Packed sorgt ja nur dafür, dass die Records genau die Größe haben die sie haben sollen. Andernfalls richtet er sie an Word (DWord) aus. Was mitunter schneller ist. Steht jedenfalls so in der Hilfe.
Registriert: Sa Nov 02, 2002 18:06 Beiträge: 299 Wohnort: Dresden
@ Lars: meinst du TGLNode = object
Hab irgendwo im Forum gelesen, dass man dieses Object eigentlich nicht mehr benutzten sollte, weils veraltet ist.
@Lossy eX: Ich versuchs mal mit dem packed überall wegmachen. Ich hatte auch schonmal packed auch schon beim TGLNode stehen.
Ich bin auf das zu groß aus folgendem Grund gekommen. Zuerst hatte ich dort stehen: Portal : Integer; das ging. Als ichs auf einen [0..3] Array geändert hatte gings nicht mehr. Hab's dann testweise auf einen [0..2] Array geändert. Das ging wieder!
_________________ "Ich würde ja gern die Welt verändern, aber Gott gibt mir den Quelltext nicht"
Registriert: Di Jul 01, 2003 18:59 Beiträge: 887 Wohnort: (The Netherlands)
Programmiersprache: fpc/delphi/java/c#
you might want to rewrite everything into classes. Then every class can take care of memory. So on create of TGLpoly you reserver memory and on destroy you free the memory.
For adding vertexes you should then write a add procedure.
I personaly think that the pointer stuf makes code hard to use. It is better to use a class whenever possible.
Ich hatte auch schon mal seltsame Fehler mit dynamischen Arrays und zwar an dann an einer ganz anderen Stelle im Programm. Eventuell geht da was mit dem Rerenzzähler durcheinander.
Klassen kümmern sich selber um die Initialisierung und Freigabe von dynamischen Arrays. Da würde ich das auch auf jeden Fall auf Klassen umstellen. Wie das bei Zeigern auf records mit dynamischen Arrays drin ist weiß ich nicht.
Mit Objekte meinte ich die neueren Objekte/Klassen.
Was du dann in den Beiden Methoden machst ist dir überlassen.
Du kannst das auch so wie die Eigenschaft Pixels von einem Canvas machen. Das ist ein mehrdimensionales Array. Du hättest dann nur 2 anstelle von einem übergabewert (für Index dann x und y).
Registriert: Sa Nov 02, 2002 18:06 Beiträge: 299 Wohnort: Dresden
Wie würdet ihr eigentlich Daten wie Vertexe oder Polygone verwlten? Dyn. Array, per GetMem so in Richtung dyn Array oder eine Liste (einfach verkettet)?
_________________ "Ich würde ja gern die Welt verändern, aber Gott gibt mir den Quelltext nicht"
Da sich die Vertex oder Index Liste zur Laufzeit vermutlich nicht ändert, würde ich ein dynamisches Array nehmen, daß man dann gleich direkt in einen Vertex oder Index Buffer kopieren kann.
Ich würde dann pro Model eine Vertexliste und für jedes Material dieses Objektes eine Indexliste speichern. Das Model selber sollte eine Klasse sein.
Zuletzt geändert von LarsMiddendorf am Sa Nov 01, 2003 22:19, insgesamt 1-mal geändert.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Also das kommt ganz darauf an welche Eigenschaften der Vertex besitzt. Im einfachsten Fall (mit statischer Struktur) genügt dazu ein Record. Also mit X, Y, Z, S und T. Evtl für die zweite oder dritte Textur auch noch mal ein S und T.
Wenn ich allerdings mehrere Variable eigenschaften hätte, dann würde mir irgendwo eine Definion meines Formatsablegen. (Liste mit Record dir mir genau beschreiben was wo ist) Und würde mit Getmem einen Speicherblock reservieren. In dem würde ich dann meine Werte schreiben. Aber wie das im Konkreten aussehen würde hängt immer ganz von dem Verwendungszweck ab.
Aber verkettete Listen sind dafür eher ungeeignet. Was sich noch anbieten würde wäre ein gesamt großer Block indem du deine Werte schreibst und dann Pointer darauf setzt. So ala VBO. Dann bräuchtest du nicht groß mehr die Daten aufbereiten sondern lädst diese direkt auf die Karte und rendest sie. Deiner Fantasie sind da keine Grenzen gesetzt.
Mitglieder in diesem Forum: 0 Mitglieder und 9 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.