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

Aktuelle Zeit: Sa Jul 12, 2025 23:29

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



Ein neues Thema erstellen Auf das Thema antworten  [ 20 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
BeitragVerfasst: Fr Okt 31, 2003 13:54 
Offline
DGL Member
Benutzeravatar

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"


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 31, 2003 14:41 
Offline
DGL Member
Benutzeravatar

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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 31, 2003 18:16 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 02, 2002 18:06
Beiträge: 299
Wohnort: Dresden
Ja, sobald ich dieses "Portal : TGLSuperPortal" weg mache funzt. Deshalb hab ich gedacht, dass das ganze zu groß wird.

Das mit den Klassen stimmt, aber ist das dann noch schnell genug? Soweit ich weiß verbrauchen Klassen mehr speicher als Records. Viel mehr?

_________________
"Ich würde ja gern die Welt verändern, aber Gott gibt mir den Quelltext nicht"


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 31, 2003 18:30 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Objekte verbrauchen pro Instanz 4 Byte mehr Speicher für den Zeiger auf die Klasse als ein record mit den gleichen Feldern.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 31, 2003 18:53 
Offline
DGL Member
Benutzeravatar

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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 01, 2003 10:18 
Offline
DGL Member
Benutzeravatar

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"


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 01, 2003 10:52 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 02, 2002 18:06
Beiträge: 299
Wohnort: Dresden
Es wird immer undurchsichtiger. Wenn man das packed bei TGLPoly wegmacht, werden plötzlich manche Leafs leer --> AccesViolation

Liegt das vielleicht an den dynamischen Arrays? Welche Alternativen würden ihr empfehlen? Per GetMem dyn. Arrays erzeugen?

_________________
"Ich würde ja gern die Welt verändern, aber Gott gibt mir den Quelltext nicht"


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 01, 2003 12:15 
Offline
DGL Member
Benutzeravatar

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.

_________________
http://3das.noeska.com - create adventure games without programming


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 01, 2003 12:38 
Offline
DGL Member
Benutzeravatar

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 01, 2003 13:57 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 02, 2002 18:06
Beiträge: 299
Wohnort: Dresden
Hmm, also TGLPoly und TGLNode als Klasse. Aber wie kann ich folgendes machen:

TGLPoly.Verts[x]

also mit so einer eckigen Klammer auf einzelne Elemente zugreifen, wenn TGLPoly eine Klasse ist und Verts kein Array.

_________________
"Ich würde ja gern die Welt verändern, aber Gott gibt mir den Quelltext nicht"


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 01, 2003 14:46 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Dafür gibt es Propertys. Und zwar würde das bei dir so aussehen.

Code:
  1. private (oder protected)
  2.   procedure SetVert(index: integer; const Value: irgendeintyp);
  3.   function GetVert(index: integer): irgendeintyp;
  4. public
  5.   property verts[index: integer]: irgendeintyp read GetVert write SetVert;

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 01, 2003 18:48 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 02, 2002 18:06
Beiträge: 299
Wohnort: Dresden
Danke, aber eine Dimension reicht erstmal :)

Ich versuchs mal.

_________________
"Ich würde ja gern die Welt verändern, aber Gott gibt mir den Quelltext nicht"


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 01, 2003 21:21 
Offline
DGL Member
Benutzeravatar

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"


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 01, 2003 22:14 
Offline
DGL Member
Benutzeravatar

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

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 01, 2003 22:18 
Offline
DGL Member
Benutzeravatar

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


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 20 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 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.010s | 15 Queries | GZIP : On ]