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

Aktuelle Zeit: Fr Jul 18, 2025 11:54

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



Ein neues Thema erstellen Auf das Thema antworten  [ 25 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 09, 2005 10:40 
Offline
DGL Member

Registriert: Mo Dez 20, 2004 08:58
Beiträge: 442
Wohnort: Mittweida (Sachsen)
Du Stellst Deine Frage aber auch reichlich spät :wink:
Also Mit ArrayVar:=Nil; wird der zugeordnete Speicher definitiv freigegeben, allserdings wie gesagt nur innerhalb Delphi. Windows kriegt das dann irgendwann schon mit.
Wenn Du gleich am Anfang des Ladens weisst, wie groß das Array werden wird (also z.b. wieviele Vertices in der Datei sind), dann kannst Du das Array auf einmal auf die richtige Länge bringen und es wird möglichst günstig im Speicher abgelegt.
btw. ein dyn array wird NICHT ständig im Specher rumkopiert, im Gegenteil wenn man z.b.: eine Kopie davon anfertigt, dann wird erst beim Ändern eines der Elemente einer Kopie das Array tatsächlich im Speicher dupliziert.
Ich vermute allerdings, Du hast irgendwo einen Speicherfresser drin, wenn Dein Programm kontinuierlich mehr Speicher belegt. Nutz doch mal nen Speichermanager, um rauszukriegen, wer da den Speicher wegfrisst. (mannmannmann mein Deutschlehrer würde sich die Haare raufen ob der vielen Wiederholungen)

_________________
Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 09, 2005 11:08 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
La Boda: Warum benutzt du zum Freigeben nicht den Destruktor oder die Procedure BeforeDestruction?? Also in dem du diese überschreibst musst du nicht extra den Destruktor kappseln und es wird immer automatisch aufgerufen, wenn deine Klasseninstanzen freigegeben werden. Selbst wenn du sie nur als TObjekt ansprechen würdest.

Zum Verwalten. Eine andere Möglichkeit wäre noch in dem du dir direkt nen Speicherbereich reservierst und deine Daten direkt so ablegst. Das geht aber nur richtig sinnvoll, wenn du weißt wie viele Punkte du hast. Anderenfalls könntest du es auch mit der Methode von Luke machen. Also immer ein wenig mehr reservieren. So könntest du den Speicher wohl auch sinnvoller an glDrawElements bzw an VBOs übergeben. Und zur Not kann man immernoch ittereativ rendern.

Um herraus zu bekommen dein Problem genau liegt solltest du evtl mal memproof oder so etwas ausprobieren. Vielleicht leigt dein Problem ja sogar wo anders.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 09, 2005 11:32 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
MemCheck ist gut. Such mal im Forum nach den beiden Begriffen. Da gibts einen Thread indem ich ein ähnliches Problem hatte, und mit den Tools mein Programm aufgeräumt habe. Das öffnet einem richtig die Augen... ;)

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 09, 2005 13:41 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 17, 2002 12:07
Beiträge: 976
Wohnort: Tübingen
Danke für die Antworten. Ich werde jetzt mal alles mit MemCheck durchchecken.

@Lossy_Ex: Ich bin jetzt nicht so der Profi (im Gegenteil) mit Klassen und TObject. Wie meinst du das mit destructor und BeforeDestruction? Sollte ich das dann so machen:

Code:
  1.  
  2. destructor Destroy; override;
  3.  
  4. ...
  5.  
  6. destructor Destroy;
  7. begin
  8.  SetLength(ArrayFoo, 0);
  9.  
  10.  inherited Destroy;
  11. end;
  12.  

_________________
"Du musst ein Schwein sein in dieser Welt, sangen die Prinzen, das ist so 1.0. Du musst auf YouTube zeigen, dass dir dein Schweinsein gefällt, das ist leuchtendes, echtes Web 2.0."
- Hal Faber

Meine Homepage: http://laboda.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 09, 2005 14:43 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ja genau. So habe ich das gemeint.

Dadurch, dass die Methode Virtuell ist (sonst könntest du sie nicht überschreiben) wird mit Free eine Kette an Destruktoren aufgerufen die alle ihren eigenen kleinen Teil frei geben. Wenn du zum Beispiel bei deiner Klasse anstelle von Freigeben Free aufrufst ist die Klasse zwar weg aber das Array nicht (direkt). Außer Delphi bekommt es mit und schmeißt es dann weg. Worauf ich nicht unbedingt wetten will.

Konstructor und procedure AfterConstruction arbeitet genau so wie BeforeDestruction und Destroy. Nur eben beim erstellen.

Bei AfterConstruction ist es zum beispiel auch so, dass wenn du 4-5 Konstructor hast und eine gewisses Unterobjekt immer erstellen willst könntest du es dahinpacken. Bei BeforeDestruction ist es eher witzlos, da es auch nur einen Destruktor gibt. Existiert wahrscheinlich nur wegen der Vollständigkeit wegen. ;-)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 09, 2005 14:48 
Offline
DGL Member

Registriert: Fr Dez 19, 2003 14:27
Beiträge: 107
Wohnort: Indianapolis, USA
Sidorion hat geschrieben:
btw. ein dyn array wird NICHT ständig im Specher rumkopiert, im Gegenteil wenn man z.b.: eine Kopie davon anfertigt, dann wird erst beim Ändern eines der Elemente einer Kopie das Array tatsächlich im Speicher dupliziert.


Code:
  1. var
  2.   a    : array of byte;
  3.   list : TObjectList;
  4.   i    : integer;
  5. begin
  6.   list := TObjectList.Create(true);
  7.   for i:=0 to 1000 do begin
  8.     SetLength(a,i);
  9.     list.Add(TObject.Create);
  10.     Memo1.Lines.Add(IntToStr(Integer(a)));
  11.   end;
  12.   list.free;


Kein einziger Zugriff auf ein Element, aber es wird im Speicher rumkopiert...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 09, 2005 14:59 
Offline
DGL Member

Registriert: Mo Dez 20, 2004 08:58
Beiträge: 442
Wohnort: Mittweida (Sachsen)
In diesem Fall kann er ja garnicht anders, weil kein Platz mehr für neues Element.
Drum sollte er ja auch nur einmal SetLength rufen, und zwar mit der zu erwartenden entgültigen Länge.
Beim Kopieren von dyn arrays wird aber tatsächlich keine Kopie erstellt, sondern erst beim ändern eines Elementes (zumindest laut borland hilfe)

_________________
Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 09, 2005 17:01 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Es sei zu erwaehnen das dynamische Arrays automatisch freigegeben werden wenn sie nicht mehr benutzt werden. Daher ist das ueberfuessig wenn ArrayFoo ein Datenelement der Klasse ist:
Code:
  1.  
  2. destructor Destroy; override;
  3.  
  4. ...
  5.  
  6. destructor Destroy;
  7. begin
  8.  SetLength(ArrayFoo, 0);
  9.  
  10.  inherited Destroy;
  11. end;
  12.  


Ansonsten gleich am Anfang den Speicher anfordern den man maximal braucht, oder ihn in nur sehr grossen Schritten erhoehen und die groesse der genutzten Elemente irgendwo anders speichern.

Evt. koennte es auch funktionieren wenn man erst SetLength(Foo, 1000) und dann anschliessend SetLength(Foo, 800) aufruft, wenn man maximal 1000 Elemente irgendwann mal haben wird und aktuell 800 hat. Aber das ist definitiv eine schlechte Loesung da es stark von der Implementierung der dynamischen Arrays abhaengt.

Wenn man generell so etwas Neu implementiert, kann man zum Beispiel Ketten nutzen.(also der Array besteht dann aus lauter "Bausteinen" von dennen der eine gewisse Anzahl von Elementen aufnimmt und einen Zeiger zum naechsten und evt. auch zum vorherigen Baustein hat). Dann kann man seinen "Array", auch wenn er gross, ist Schrittweise erweitern und verursacht keine riesigen Kopieraktionen. Der Nachteil von dieser Methode ist das man immer alle "Bausteine" durchlaufen muss um alle Elemente zu erreichen.
Um dann die Geschwindigkeit ueber Indexe wieder zu erhoehen koennte man dann wieder die "Bausteine" baumartig anordnen.

Man erkennt an dem Beispiel recht schoen das man viel Rechnerleistung und Programmieraufwand spart wenn man vorher schon die maximale Groesse des Arrays ermittelt.

MfG
Flo

_________________
Danke an alle, die mir (und anderen) geholfen haben.
So weit... ...so gut


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 09, 2005 17:24 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 17, 2002 12:07
Beiträge: 976
Wohnort: Tübingen
Danke für die Antworten! So wie Flo es in seinem Beispielcode gemacht hat, habe ich es aber auch schon mal versucht, es hat nicht geklappt, so wie es sollte. Ich werd dem aber nochmal nachgehen.
Interimsmäßig arbeite ich jetzt damit, dass halt nur beim Start des Spiel Daten ein den Speicher geschaufelt werden, die Modelle bleiben in mehreren Runden gleiche. Nicht schön ich möchte das schon gerne lösen. Vor allem weil das Problem schon von essentieller Natur ist, wenn ich mal "bessere" Programme/Spiele habe, muss ich ja auch mit vielen Modellen und Levels (die natürlich nacheinander geladen werden müssen) hantieren.

_________________
"Du musst ein Schwein sein in dieser Welt, sangen die Prinzen, das ist so 1.0. Du musst auf YouTube zeigen, dass dir dein Schweinsein gefällt, das ist leuchtendes, echtes Web 2.0."
- Hal Faber

Meine Homepage: http://laboda.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 09, 2005 17:38 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
Sidorion hat geschrieben:
Also Mit ArrayVar:=Nil; wird der zugeordnete Speicher definitiv freigegeben, allserdings wie gesagt nur innerhalb Delphi. Windows kriegt das dann irgendwann schon mit.


Funktioniert dann also wie ein Memory Pool oder?


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


Wer ist online?

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