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

Aktuelle Zeit: Fr Jul 18, 2025 21:03

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: Di Okt 03, 2006 17:01 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Danke nu gehts. Allerdings weiss ich nich wo ich FullDebugMode und LogMemoryLeakDetailToFile enablen soll. Habe schon in der FastMM4 geschaut, aber bin nich wirklich fündig geworden. Das wär noch nett.

Bei mir kommt nun folgende Meldung:
Bild

Ich weiss zwar in etwa wo ich die EasySDLTextures definiere und die Stringlist etc, aber unknown weiss ich logischweise nich, also was sagen mir die byteangaben davor? bekomm ich da irgendwie eine Zeilenangabe raus?

Mit was für nem Rechner hast du das ausgeführt?
Bei mir (2.6gh, 512 mb ram, radeon 9600) hab ich nur 60fps...


EDIT habe nun rausbekommen, wie ich (theoretisch) die linezahl und unit herausbekomme, wo die leaks auftreten, aber dazu muss ich auch erst ein paar definies aktivieren und das weiss ich ja wiederum nicht ;)


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

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

Ich arbeite mit FastMM version 4.56 in Deutsch.
(schließlich ist da auch meine (schlechte) Übersetzung ins deutsche vom Author mit beigelegt worden)

und hier hab ich dir mal meine Konfiguration auf meiner HP hinterlegt, damit kommt KEIN Dialogfenster, dafuer aber dann eine Dateiausgabe ins Projektverzeichnis.
tausche einfach die beiden dateien aus.

mein Rechner:
2,8 GHz intel P4, 2GB RAM, gesamt 1,27 TByte an HD's und WinFast A310 als Grafikkarte
(HD wegen Filme und DVD erzeugung vom TV )

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: Di Okt 03, 2006 22:14 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Danke danke so funkt es.
Allerdings habe ich nun noch ein Prob:
Code:
  1. --------------------------------2006/10/3 23:07:05--------------------------------
  2. A memory block has been leaked. The size is: 12
  3.  
  4. Stack trace of when this block was allocated (return addresses):
  5. 402A1D [System][@ReallocMem]
  6. 405724 [System][DynArraySetLength]
  7. 4057FA [System][@DynArraySetLength]
  8. 47FFE1 [easySDLTextures.pas][easySDLTextures][TEasySDLTextures.Load][237]
  9. 481003 [Effect.pas][Effect][TEffekt.LoadTexture][181]
  10. 480DB6 [Effect.pas][Effect][TEffekt.Create][136]
  11. 4086A5 [FastMM4.pas][FastMM4][UpdateHeaderAndFooterCheckSums][5323]
  12. 409121 [FastMM4.pas][FastMM4][DebugGetMem][5604]
  13. 402A1D [System][@ReallocMem]
  14.  
  15. The block is currently used for an object of class: Unknown
  16.  
  17. Current memory dump of 256 bytes starting at pointer address 1128220:

Da ich alles hier nach eh nich interpretieren kann, bis zur naechsten Bugmeldung lass ich das einfach ma weg.
Also wenn man es durchgeht, dann sehe ich da viele Dateien, die nich von mir sind. Wenn ich weiterhin davon ausgehe, dass diese Dateien so aufgebaut sind, dass sie keine Memoryleaks verursachen, kann ich sie wohl getrost ignorieren und wende mich nur meinen Dateien in der "LeakDoku" zu.
D.H.:
Code:
  1. 481003 [Effect.pas][Effect][TEffekt.LoadTexture][181]
  2. 480DB6 [Effect.pas][Effect][TEffekt.Create][136]


Die Dazugehörigen Zeilen sind:
Code:
  1. procedure TEffekt.LoadTexture;
  2. begin
  3.   Texture := TEasySDLTextures.Create;
  4.   Texture.Load(TexturePath, TextureName);
  5. end;
Hier explizit das Load

und:
Code:
  1.  [...]  try
  2.     LoadTexture;
  3.     BugTracker.AddBugReport('# TEffekt.Create: ' + TextureName + ' in ' + TexturePath + ' loaded successfully');
  4.   except
  5.     BugTracker.AddBugReport('> TEffekt.Create: Failed to load Textur ' + TextureName + ' in ' + TexturePath);
  6.   end;[...]

Das ist aus dem Constructor von TEffekt.. die explizite Zeile ist LoadTexture.

Anzumerken hierbei ist, dass Texture vom Typ TEasySDLTextures ist. Um ehrlich zu sein, weiss ich nun auch nicht, wie ich hier ein Leak fabriziere. Bitte an diesem Beispiel mal um aufklärung. Ich sehe mir mal die restlichen an


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 03, 2006 22:34 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
So nachdem ich mir das nochma angesehen habe, liegen eigentlich alle Fehler irgendwo um die LoadTextures rum.

Bis auf eine Fehlermeldung hat jede etwas mit der EasySDLTextures zu tun, und da immer mit Create oder Load...
Manchmal sind meine Units auch völlig unschuldig. Kann es sein, dass der Konstructor der EasySDLTextures schon mit Leakanfaelligkeit geschrieben wurde?

Hier ein Bsp:
Code:
  1. A memory block has been leaked. The size is: 52
  2.  
  3. Stack trace of when this block was allocated (return addresses):
  4. 4029A3 [System][@GetMem]
  5. 403A63 [System][TObject.NewInstance]
  6. 403DD2 [System][@ClassCreate]
  7. 403A98 [System][TObject.Create]
  8. 403A6C [System][TObject.NewInstance]
  9. 403DD2 [System][@ClassCreate]
  10. 47FD96 [easySDLTextures.pas][easySDLTextures][TEasySDLTextures.Create][188]
  11. 4808F5 [easySDLTextures.pas][easySDLTextures][initialization][556]
  12. 404514 [System][InitUnits]
Da is gar keine meiner Units drin...

Tja wenn ich alle Leaksizes zusammenrechne komm ich auf: 284. Ka ob das nun viel oder wenig ist.

Vllt kann ja wer Licht in die Sache bringen


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 03, 2006 22:54 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Du erstellst für jede Textur eine eigene Variante des Texturmanagers?
Das du so viel Speicher belegst sollte klar sein oder?

Zu den vermutlichen Bug in easySDLTextures kann ich nur sagen das die Beispiele aus dem SDK recht konstanten Speicherbedarf haben und ich somit den Fehler in deinem Code vermute.

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 03, 2006 23:48 
Offline
DGL Member
Benutzeravatar

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

iOnOs wird denk ich mal recht haben.
Um Dir zu zeigen wie es funktioniert mit dem FastMM, hab ich mal ein einfaches Project (reines Delphi) mit einem Button versehen. Beim Klick wird eine TStringlist erzeugt, welche aber nie wieder freigegeben wird.
Als reportdatei erhalte ich dann folgendes:
[code]

--------------------------------2006/10/4 0:33:34--------------------------------
Ein Speicherblock hat Speicher verloren. Die Größe ist: 52

Aufrufstack, von wem der Block momentan belegt wird (Rücksprungadressen):
402D38 [System][@GetMem]
40377B [System][TObject.NewInstance]
403AFE [System][@ClassCreate]
4037B0 [System][TObject.Create]
452818 [Unit1.pas][Unit1][TForm1.Button1Click][29] <<<<< Hier gibt's den Hinweis !!!!!!!!!!
40397F [System][@IsClass]
4330CE [Controls][TControl.Click]
42B955 [StdCtrls][TButton.Click]
42BA49 [StdCtrls][TButton.CNCommand]

Der Block wird momentan für eine Objektklasse benutzt TStringList

Aktueller Speicherauszug von 256 Bytes, beginnend ab Zeigeradresse EDACD0:
B8 62 41 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90 53 12 FF 80 80 80 80 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
¸ b A . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .

_________________
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: Mi Okt 04, 2006 06:06 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Ja Uwe wie ich das deute, das dachte ich mir schon^^
Denke mal i0n0s hat recht. ich bau aus Loadtexture einfach nen Texturmanager und speicher innerhalb meiner klasse nur noch den namen der textur. dann sollte es leichter von der hand gehen. vllt speicher ich auch namen und pfad und rufe im constructor den texturmanager auf mal sehen


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

Registriert: Di Sep 03, 2002 15:08
Beiträge: 662
Wohnort: Hamburg
Programmiersprache: Java, C# (,PhP)
Um nicht zuviel umschreiben zu müssen, könntest du den TextureManager als Singleton implementieren. Das Singleton Pattern ist nicht unbedingt das schönste, doch immer wieder praktisch ;)

_________________
(\__/)
(='.'=)
(")_(")


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

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Ich habes jetz so gemacht, dass mein TextureManager im Create der Engine erstellt wird, und an alle unterdateien übergeben wird.
Ka ob das sinnvoll ist ^^ hoffe es ma

Edit: So also nun kommt bei mir trotz der einmaligen texturemanager erstellung der fehler...
Code:
  1. 4029A3 [System][@GetMem]
  2. 403A9F [System][TObject.NewInstance]
  3. 403E0E [System][@ClassCreate]
  4. 480C7D [TextureManager.pas][TextureManager][TTextureManager.Create]
  5. 47F9B3 [BugTracker.pas][BugTracker][TBugTracker.AddBugReport][36]
  6. 48280F [Engine.pas][Engine][TEngine.Create][113]
  7. 484D10 [Test.pas][Test][TForm1.FormCreate][37]
  8. 44984B [Forms][TCustomForm.DoCreate]
  9. 44952B [Forms][TCustomForm.AfterConstruction]


Wenn man sich zu den entsprechenden 3 Zeilen den Code ansieht, kommt folgendes bei heraus:
Code:
  1. procedure TBugTracker.AddBugReport(const NewReport: string);
  2. begin
  3.   Content.Add(NewReport);  <------- z.36
  4.   NumBugReports := NumBugReports + 1;
  5. end;


Code:
  1. [...]
  2. (***** Textures initilasieren *************************************************)
  3.   TextureManager := TTextureManager.Create(BugTracker); <---- z.113
  4.   InitTextures;[...]


Code:
  1. procedure TForm1.FormCreate(Sender: TObject);
  2. begin
  3.   Engine := TEngine.Create(Form1,Form1.Handle); <--- z.37
  4.   Engine.SetupGL(0,0,0,0);
  5.   SetupGl;
  6. end;


Explizit nochma: Ich erstelle den TextureManager wirklich nur EINMAL. Danach wird er an die entsprechenden Dateien nur noch übergeben, um verschiedene LoadTextures möglich zu machen. Nu weiss ich nimmer weiter..


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

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

Keine Ahnung was nun der FastMM sagt, denn den Teil hast unterschlagen. :shock:

Solange der nun nicht sagt, daß was nicht freigegeben wurde, sondern noch beim Beenden im Speicher stand, ist alles okay. Die eckigen Klammern zeigen dir im Fehlerfall eben nur die Zeilennummern an, wo was passierte, also mit Speicher zu tun hat.

Angenommen es kommt keine FastMM-Meldung (bzw Protokolldatei ), gehe ich mal von aus, daß Du jetzt Rat suchst, warum Dein Prog immer noch so viel Speicher frisst. Da ist dann aber der beigelegte Source zu gering, bzw du solltest mal nach Dyamischen Arrays schauen, denn für irgendwas wird ja der Speicher verschwendet.

Alternativ kannst auch dein Prog mit Einzelschritten durchlaufen, und dabei den TaskManager-Speicherbereich im Auge behalten.

Gruß Uwe

PS
im OnCreate des Form bin ich immer mißtrauisch, was anderes zu createn.
aber es ist durchaus sinvoll und praktisch.
evtl kannst auch onShow nehmen.

_________________
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: Mi Okt 04, 2006 16:48 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Ja also das gesamte Beispiel:
[pascal]
--------------------------------2006/10/4 17:40:50--------------------------------
A memory block has been leaked. The size is: 12

Stack trace of when this block was allocated (return addresses):
402A1D [System][@ReallocMem]
405760 [System][DynArraySetLength]
405836 [System][@DynArraySetLength]
4802F1 [easySDLTextures.pas][easySDLTextures][TEasySDLTextures.Load][237]
480DE3 [TextureManager.pas][TextureManager][TTextureManager.Load][42]
482AE9 [Engine.pas][Engine][TEngine.InitTextures][149]
482820 [Engine.pas][Engine][TEngine.Create][114]
484D10 [Test.pas][Test][TForm1.FormCreate][37]
44984B [Forms][TCustomForm.DoCreate]

The block is currently used for an object of class: Unknown

Current memory dump of 256 bytes starting at pointer address 1127ED8:
01 00 00 00 01 00 00 00 01 00 00 00 88 81 ED FE 00 00 00 00 80 65 12 01 00 00 00 00 00 00 00 00
FF FF FF FF A3 29 40 00 9F 3A 40 00 0E 3E 40 00 7D 0C 48 00 B3 F9 47 00 0F 28 48 00 10 4D 48 00
4B 98 44 00 2B 95 44 00 C3 29 40 00 9A 48 40 00 2E FC 45 00 E2 FD 45 00 E7 37 46 00 99 27 48 00
10 4D 48 00 4B 98 44 00 2B 95 44 00 0C 00 00 00 00 00 00 00 EF 7E 12 01 58 0C 48 00 B0 D2 13 01
B0 10 13 01 10 81 ED FE 00 00 00 00 49 81 12 01 00 00 00 00 00 00 00 00 00 00 00 00 A3 29 40 00
25 49 40 00 50 49 40 00 6E FB 47 00 6E FB 47 00 03 3B 40 00 50 34 48 00 60 CE 86 00 20 4F 48 00
C3 29 40 00 9A 48 40 00 58 36 48 00 20 4F 48 00 C7 98 44 00 2D 97 44 00 78 3E 40 00 3B 97 44 00
EC DD 41 00 0C 00 00 00 00 00 00 00 68 7F 12 01 D4 A8 48 00 80 80 80 80 80 80 80 80 97 80 ED FE
. . . . . . . . . . . . ˆ


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

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
So nun habe ich alle dateien nach und nach ausgeklammert und die fonts waren es. es war genauer gesagt meine eigene funktion, die in jedem render aufgerufen wurde:
Code:
  1. function  TextWidth (Font: TFont; const text: string): Integer;
  2. var minX, maxX, minY, maxY, advance, nWidth, i: Integer;
  3.     pFont : PTTF_Font;
  4. begin
  5.   pFont := TTF_OpenFont(PChar(Font.Name), Font.Height);
  6.   TTF_SetFontStyle(pFont, Font.Style);
  7.  
  8.   nWidth:=0;
  9.  
  10.   for i:=0 to Length(text)-1 do
  11.   begin
  12.     TTF_GlyphMetrics(pFont, ORD(text[i]), minX, maxX, minY, maxY, advance);
  13.     nWidth := nWidth+maxX-minX;
  14.   end;
  15.   result:=nWidth;
  16.   TTF_CloseFont(pFont);
  17. end;


Das TTF_CloseFont habe ich vergessen. Nun allerdings noch eine Sache... So wies @ mom ist, erzeugt er 60mal die Sekunde ne font, holt sich von einigen zeichen die höhe und breite, rechnet etwas und schliesst die font wieder...
Das is sicher nich ganz so performanceschonend. Meine Idee deshalb:

TFont aus der EasySDLFont ableiten und um ein Array erweitern, indem ich für jeden Buchstaben Höhe und Breite schreibe. Dann wird diese funktion nur im Load meines FontManagers aufgerufen und danach werden nur noch Arrays abgefragt. ist die meiner meinung nach sinnvollste Lösung.

Vllt hat aber wer ne bessere lösung?


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

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

Ob Du nun gleich was irgendwo ableiten musst bezweifel ich.
warum machst du diese Breiten/Höhen-ermittlung nicht einmalig zu Anfang deines Progs, und greifst dann beim Rendern auf dieses Array jeweils zu. Da hast du doch dann all deine Werte drinn, und vor allem nur einmal gerechnet !

und bei mehreren Fonts eben mehrere Arrays 8)

etwa so :
Code:
  1.  
  2. type
  3.     TMyFontDaten = record
  4.       breite,
  5.       hoehe  : integer;
  6.       [...]
  7.     end;
  8. var MyFontDaten : array[0..255] of TMyFontDaten;
  9.  


somit haettest du zB fuer ein großes "A" dann mit
x := MyFontDaten[Ord("A")].Breite;
im x deine passende Breite schon drin, und das dann beim Rendern ohne neuberechnen.
Statt Ord("A") wirst warscheinlich bei einem String eben MeinString[2] nehmen können.

Gruß Uwe

PS
Freut mich daß Du nun endlich den Speicherfresser gefunden hast.

_________________
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: Mi Okt 04, 2006 18:54 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Ja genauso hatte ich es ja gedacht, aaaaaber ich würde es gern von der TFont aus EasySDLFont ableiten, damit ich das ding direkt über OOP nutzen kann. Ich will nich ein Dynamisches Array of Array[0..255] of Record machen, das is mir zu umstaendlich.
Da leite ich lieber die TFont ab, setze ein Array[0..255] mit rein und zack hat sichs


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

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

Ja kann man auch machen, waer mir aber zu viel Arbeit (meine Meinung) :P

Mach die Fonterzeugung aber wenn's geht auch nur einmal zuvor, somit musst du nicht beim Rendern immer neu erzeugen und closen.

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 1 Gast


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 ]