Einzelnen Beitrag anzeigen

Benutzerbild von littleDave
littleDave

Registriert seit: 27. Apr 2006
Ort: München
556 Beiträge
 
Delphi 7 Professional
 
#9

Re: glDeleteTextures gibt Speicher nicht frei

  Alt 23. Mai 2008, 13:21
Ok, der Texturloader vom Jan Horn sollte nicht das Problem sein, den hab ich früher auch verwendet.
Ich glaube, du lädst die Texturen doppelt. Die if-Abfragen
Delphi-Quellcode:
if (aCovers.count <= QuadCount) then
// ...
if (aCovers.count >= QuadCount) then
überlagern sich, falls aCovers.Count = QuadCount ist. Außerdem: kann es ein, dass du aCovers nicht mehr freigibst (oder hast du das aCovers.Free einfach nur nicht mit in den Post kopiert)?

Ich würd die Lade-Routine mal umschreiben, im Moment ist die noch relativ umständlich:

Delphi-Quellcode:
if FileExists(Path + UpperCase('Data\images\CompDisk\Default\NoCover.jpg')) then
   LoadTexture(Path + 'Data\images\CompDisk\Default\NoCover.jpg', NoCoverTexture, False)
else
   NoCoverTexture := 0;

aCovers := TStringList.Create;
try
  if CoverPath <> Path then
     ScanDirectory(CoverPath, 'bmp, tga, jpg', True);

  aFilledQuads := 0;
  for i:=0 to aCovers.Count-1 do
  begin
    // den Dateinamen extrahieren
    aFileName := ExtractFileName(aCovers[i]);
    // die Dateiendung abscheiden
    aFileName := Copy(aFileName, 1, length(aFileName) - length(ExtractFileExt(aFileName)));
    // Upper-Case machen
    aFileName := AnsiUpperCase(aFileName);

    if (aFileName = 'COVER') or (aFileName = 'CDLABEL') then
    begin
      LoadTexture(aCovers[i], quadTexture[i], False);
    end else
      QuadTexture[i] := NoCoverTexture;

    inc(aFilledQuads);
    
    // Schleife beenden, falls alle Elemente von quadTexture gefüllt sind
    if i >= High(quadTexture) then
       break;
  end;
 
  // Falls noch ein paar ungefüllte Quads übrig sind, werden die auch noch mit der
  // NoCoverTexture gefüllt
  for i:=aFilledQuads to High(quadTexture) do
    QuadTexture[i] := NoCoverTexture;
finally
  aCovers.Free;
end;
Keine Garantie auf Korrektheit, hab den Quelltext ohne offene IDE geschrieben
Jabber: littleDave@jabber.org
in case of 1 is 0 do external raise while in public class of object array else repeat until 1 is 0
  Mit Zitat antworten Zitat