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

Aktuelle Zeit: Fr Jul 18, 2025 21:07

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



Ein neues Thema erstellen Auf das Thema antworten  [ 49 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3, 4  Nächste
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 04, 2006 19:28 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Ja so will ich es ja machen. eben im load meines fontmanagers, das wird nur einmal aufgerufen


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 04, 2006 20:33 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
So nun hat mein Programm einen speicherverbrauch von etwa 25K und einer CPUbelastung von etwa 10%.

Ist das ok?

Edit: die restlichen Memoryleaks bekomm ich allerdings partout nicht geregelt


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 04, 2006 22:19 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jul 14, 2006 13:08
Beiträge: 117
Wohnort: Berlin
hi Shaddow,

Welche Leaks sind denn noch übrig ?

schick mal die gesamte Reportdatei an meine mail.
Gruß Uwe

_________________
Die 3 Totfeinde eines Programmierers ?
a) Tageslicht
b) frische Luft
c) ..und das ständige Gebrüll der Vögel


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 06, 2006 03:04 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jul 14, 2006 13:08
Beiträge: 117
Wohnort: Berlin
hi Shaddow,

keine Rückmeldung ? :cry:

Hab dir was per email zurückgeschickt. Hoffe das ist nicht im Spamfilter gelandet.
Aber vielleicht arbeitest auch noch dran

Gruß Uwe
...und gutes gelingen

_________________
Die 3 Totfeinde eines Programmierers ?
a) Tageslicht
b) frische Luft
c) ..und das ständige Gebrüll der Vögel


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 06, 2006 07:04 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Habs heute morgen gesehen, hatte gestern keine Zeit. Setze mich heut Nachmittag dran danke


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 06, 2006 21:53 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Nun nachdem ich den texturenmanager auch habe wieder löschen lassen ;) sind nun einige leakmsgs weniger da:
Code:
  1.  
  2. 13 - 20 bytes: String x 2
  3. 29 - 36 bytes: Unknown x 1
  4. 45 - 52 bytes: TStringList x 2


Strings: kA habe hauptsächlich const strings. Ansonsten wüsste ich aber auch nich, dass man strings wieder freigeben müsse?
Unknown:.. tja ich kenns auch nich
Stringlist: benutz ich gar nich, in keiner Datei nur hashedstringlists


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 14, 2006 16:00 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jul 14, 2006 13:08
Beiträge: 117
Wohnort: Berlin
hi Shaddow,

So hab jetzt mal ohne DVD-Renderimg, und komme auf 1006 fps.
(sorry, aber bei der teuren Umbau-investition :twisted:, brauch ich mal was erfreuliches :wink:)

Nun zu FastMM..,
Das was du noch übrig hast, kann ich nicht ohne Source zuordnen.
Ich vermute stark das es sich nur noch um ein einzigstes Object handelt.
Daher auch die Strings, welche nicht freigegeben werden.( wie auch, macht doch delphi ).

Ein construct wie folgender ...
Code:
  1. type
  2.   TMyObject = object
  3.     str1    : string;
  4.     str2    : string;
  5.     StrL1  : TStrings;
  6.     StrL2  : TStrings;
  7.   end;
  8.  


...würde nach vergessener Freigabe in etwa dieselbe Fehlermeldung präsentieren.
Dein "Unknown" repräsentiert das Object selbst, und daraus resultieren die mitgeführten strings und StringList(en) als "nicht freigegeben".

So etwas musst du suchen, und dann bist du es Los.
schaue in deiner Protokolldatei, wo TStringlist(en) erzeugt werden. Meist handelt es sich dann genau um dieses object, welches die TStrings beinhaltet.
Deklariert als TStrings oder TStringlist, aber erzeugt wird immer mit xxx := TStringList.Create

Gruß Uwe

_________________
Die 3 Totfeinde eines Programmierers ?
a) Tageslicht
b) frische Luft
c) ..und das ständige Gebrüll der Vögel


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 14, 2006 17:33 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
ja danke nur das prob ist, ich habe GAR keine stringlisten mehr drin sondern nur noch hashedstringlisten udn die habe ich schon alle durchgechecked. ich sehe gleich nochmal durch und poste dann die codefragmente, von denen ich denke dass sie vllt was verursachen. ma schaun


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 14, 2006 17:55 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jul 14, 2006 13:08
Beiträge: 117
Wohnort: Berlin
na HashedStringListen sind doch nix anderes.
hier mal den Auszug aus der Hilfe

THashedStringList verwaltet eine Stringliste mit einer internen Hash-Tabelle.
Zitat:
Unit

IniFiles

Beschreibung

Ein THashedStringList-Objekt ist eine Stringliste, die intern eine Hash-Tabelle verwendet, um die Suche nach Strings zu beschleunigen. Es wird intern von TMemIniFile verwendet, um die Strings in einer INI-Datei zu verwalten. Das Objekt kann jedoch wie jede andere Stringliste genutzt werden. Insbesondere bei Listen mit einer großen Anzahl von Strings kann die Leistung durch die Verwendung der Klasse THashedStringList anstelle von TStringList optimiert werden.


Uwe

_________________
Die 3 Totfeinde eines Programmierers ?
a) Tageslicht
b) frische Luft
c) ..und das ständige Gebrüll der Vögel


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 14, 2006 18:08 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Ja danke ich weiss was Hashedstringlists sind ;)
Aber wie ich bereits sagte, sind alle Hashedstringlisten durchgechecked

Habe in meinem Fontmanager eine Hashedstringlist:
Code:
  1.  
  2. constructor TFontManager.Create();
  3. begin
  4.   inherited Create;
  5.   FontNames := THashedStringList.Create;
  6.   NumFonts := 0;
  7. end;
  8.  

und wird brav im destructor zerstört (,der auch aufgerufen wird):
Code:
  1.  
  2. destructor TFontManager.Destroy();
  3. var i:Integer;
  4. begin
  5.   try
  6.     FontNames.Free;                
  7.     BugTracker.AddBugReport('# TFontManager.Destroy: FontNames destroyed successfully');
  8.   except
  9.     BugTracker.AddBugReport('> TFontManager.Destroy: Failed to destroy FontNames');
  10.   end;
  11.   try
  12.     for i:=0 to Length(Fonts)-1 do
  13.       Fonts[i].Free;
  14.     BugTracker.AddBugReport('# TFontManager.Destroy: Font destroyed successfully');
  15.   except
  16.     BugTracker.AddBugReport('> TFontManager.Destroy: Failed to destroy Font');
  17.   end;
  18.   inherited Destroy;
  19. end;
  20.  

Hatte auch schon Destroy statt Free

Auch im Bugtracker nutz ich ne HashedStringList:

Code:
  1.  
  2. constructor TBugTracker.Create(const NFileName: string);
  3. var i:Integer;
  4. begin
  5.   inherited Create;
  6.   FileName := NFileName;
  7.   NumBugReports := 0;
  8.  
  9.   if FileExists(FileName) = FALSE then FileCreate(FileName);
  10.  
  11.   Content := THashedStringList.Create;
  12. end;
  13.  

und fein zerstören
Code:
  1.  
  2. destructor TBugTracker.Destroy;
  3. begin
  4.   Content.SaveToFile(ExtractFilePath(ParamStr(0))+FileName);
  5.   Content.Free;
  6.   inherited Destroy;
  7. end;
  8.  


Es werden alle Destructoren fein aufgerufen im Destructor meines Formulars. Nur leider bleiben die Leaklogs...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 14, 2006 18:51 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jul 14, 2006 13:08
Beiträge: 117
Wohnort: Berlin
hi Shaddow,

So aus der Ferne wird dann nicht mehr viel Diagnosemöglichkeit machbar sein.
wie geagt, alle "Create"s suchen, mit Haltepunkt vllt. Name aufschreiben,
den passenden Free suchen ....

Am Ende MUSS was übrigbleiben :wink:

ist ne echte schei..-arbeit, aber da musst du durch. Ich hab mal 14 Tage gebraucht, und seit dem bastel ich den FastMM gleich zu Anfang rein, und baue dann das Prog weiter. Zum schluss die Compilereinstellung (T32debug) rausgenommen und FastMM ausgeremmt, und dann hast auch wieder ne kleine EXE.

Gruß Uwe

PS : versuche einzelne Objecte aus deinem Programm vorrübergehen auszukommentieren.
dann neu Compilieren. Ändert sich nix, dann wars das falsche, und dann nimmst das nächste usw.

gutes Gelingen :wink:

_________________
Die 3 Totfeinde eines Programmierers ?
a) Tageslicht
b) frische Luft
c) ..und das ständige Gebrüll der Vögel


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 15, 2006 21:49 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
Folgendermaßen kann man mit FastMM4 die Lecks recht gut finden:
1. FullDebugMode in der FastMM Konfig (FastMMOptions.inc) aktivieren
2. In den Projektoptionen der zu debuggenden Anwendung in den Projektoptionen unter Linker Map-Datei auf detailliert stellen (vllt gehts auch mit ner niedrigeren Einstellung, ich habs jedoch nur mit detailliert getestet)
3. In der ProjektName_MemoryManager_EventLog.txt stehen nur die Speicherlecks mit Inhalt und Daten darüber wo du der Speicher reserviert wurde.
Zitat:
...
A memory block has been leaked. The size is: 4

Stack trace of when this block was allocated (return addresses):
402942 [System][@GetMem]
402ED9 [System][TObject.NewInstance]
403212 [System][@ClassCreate]
402F18 [System][TObject.Create]
46D32B [Main.pas][Main][Init][50]
46D337 [Main.pas][Main][Init][52]
46D3B5 [Main.pas][Main][TForm1.FormCreate][74]
437AE7 [Forms][TCustomForm.DoCreate]
43782A [Forms][TCustomForm.AfterConstruction]

The block is currently used for an object of class: TObject
...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 27, 2006 22:11 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Also ich habs mir jetz nochma angesehen und es hat sich herausgestellt, dass in meinem Texturemanager 5 Stringleaks und 1 Stringlistleak sind.
Hier mal der Code, ich find den fehler partout nicht:
Code:
  1. unit TextureManager;
  2. {TStringlist, 5xStrings, Unknown Memoryleak}
  3. interface
  4.  
  5. uses EasySDLTextures,
  6.      BugTracker,
  7.      Tools,Dialogs;
  8.  
  9. type TTextureManager = class(TObject)
  10.   private
  11.     Textures: TEasySDLTextures;
  12.     BugTracker: TBugTracker;
  13.   public
  14.     constructor Create;                           overload;
  15.     constructor Create(NBugTracker: TBugTracker); overload;
  16.     procedure   Load(const NTexturePath, NTextureName: string);
  17.     procedure   Bind(const NTextureName: string);
  18.     destructor  Destroy;
  19. end;
  20.  
  21. implementation
  22.  
  23. constructor TTextureManager.Create;
  24. begin
  25.   Textures := TEasySDLTextures.Create;
  26. end;
  27.  
  28. constructor TTextureManager.Create(NBugTracker: TBugTracker);
  29. begin
  30.   inherited Create;
  31.   try
  32.     Textures := TEasySDLTextures.Create;
  33.     BugTracker := NBugTracker;
  34.     BugTracker.AddBugReport('# TTextureManager.Create: Texturemanager initialized successfully');
  35.   except
  36.     BugTracker.AddBugReport('> TTextureManager.Create: Failed to initialize Texturemanager');
  37.   end;
  38. end;
  39.  
  40. procedure TTextureManager.Load(const NTexturePath, NTextureName: string);
  41. begin
  42.   try
  43.     Textures.Load(NTexturePath, NTextureName);
  44.     BugTracker.AddBugReport('# TTextureManager.Load: ' + NTextureName + '(' + NTexturePath + ') loaded successfully');
  45.   except
  46.     BugTracker.AddBugReport('> TTextureManager.Load: Failed to load ' + NTextureName + '(' + NTexturePath + ')');
  47.   end;
  48. end;
  49.  
  50. procedure TTextureManager.Bind(const NTextureName: string);
  51. begin
  52.   Textures.Bind(NTextureName);
  53. end;
  54.  
  55. destructor TTextureManager.Destroy;
  56. begin
  57.   Textures.Free;
  58.   inherited Destroy;
  59. end;
  60.  
  61. end.
  62.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 27, 2006 22:18 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jul 14, 2006 13:08
Beiträge: 117
Wohnort: Berlin
hi Shaddow,

zwischen 24 und 25 sollte benfalls ein "inherited create" rein.
Soweit alles io, aber wie ist dein TBugTracker aufgebaut ?
der ist ja auch enthalten ?
Ist der deine Fehlerquelle?

Gruß Uwe

Beitrag wurde kommplett editiert, da zuvor falsche Aussage
((hoffe jetzt ist richtig)

_________________
Die 3 Totfeinde eines Programmierers ?
a) Tageslicht
b) frische Luft
c) ..und das ständige Gebrüll der Vögel


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 27, 2006 23:00 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jul 14, 2006 13:08
Beiträge: 117
Wohnort: Berlin
so , hab jetzt mal was nachgebastelt.

Code:
  1.  
  2. unit Unit1;
  3.  
  4. interface
  5.  
  6. uses
  7.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  8.   Dialogs;//, easySDLTextures;
  9.  
  10. type
  11.   TForm1 = class(TForm)
  12.     procedure FormCreate(Sender: TObject);
  13.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  14.   private
  15.     { Private-Deklarationen }
  16.   public
  17.     { Public-Deklarationen }
  18.   end;
  19.  
  20. var
  21.   Form1: TForm1;
  22.   //x : TEasySDLTextures;
  23.  
  24. implementation
  25.  
  26. {$R *.dfm}
  27.  
  28. procedure TForm1.FormCreate(Sender: TObject);
  29. begin
  30.  // x := TEasySDLTextures.Create;
  31. end;
  32.  
  33. procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
  34. begin
  35.   //x.free;
  36. end;
  37.  
  38. end.
  39.  


es reicht schon aus, die uses-Anweisung wieder in Betrieb zu nehmen, also die EasySDLTextures einzubinden.
Du brauchst nicht einmal das x im Programm "an"zuschalten, das kann alles auskommentiert bleiben.

Und schon zeigt dir FastMM4 eine verlorene TStringList beim beenden des Programms an.

Da stimmt wohl dann mit der EasySDLTextures was nicht.

Gruß Uwe

_________________
Die 3 Totfeinde eines Programmierers ?
a) Tageslicht
b) frische Luft
c) ..und das ständige Gebrüll der Vögel


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


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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.010s | 15 Queries | GZIP : On ]