![]() |
AW: Beschleunigung von Laderoutine
Nimm doch statt nem Array eine Liste. Das ist doch tausend mal einfacher als den Kram in Arrays rumzuschieben.
Außerdem ist die Zeile hier unnötig:
Delphi-Quellcode:
if aCovers.count > -1 then
Eine Liste hat immer mehr als -1 Einträge ;) |
AW: Beschleunigung von Laderoutine
Wie sieht denn die LoadTexture-Methode aus?
Wäre es nicht auch zweckmäßig diese zu untersuchen, da du im ersten Post schreibst, das diese Methode blockt? |
AW: Beschleunigung von Laderoutine
Zitat:
Auf der einen Seite sagst du verstehst es nicht was ich mache aber im gleichen Atemzug gehst du davon aus Zitat:
Zitat:
Wenn es schnell genug wäre hätte ich mir die Frage danach sparen können und euch damit nicht belästigt. Das Problem ist das ich die Covers jedes Mal alle neu einlade. Nun habe ich versucht die Texturen umzustrukturieren. Die erste Texture wird gelöscht und diese dann mit der darauffolgendem neu gefüllt. Das geht schnell ohne das ich alle Texturen neu laden muss. Das Problem das aber nun auftaucht ist das dann die letzte Texture ungültig wird weil sie verschoben wurde. Dies hat zur folge das beim laden der letzten Texture die Nummerierung nicht fortläuft. Das laden von 25 Texturen nach jedem Liedwechsel verursacht in etwa eine Ladezeit von 2> Sekunden was mein Plugin quasi anhält. Das will ich vermeiden. gruss |
AW: Beschleunigung von Laderoutine
Zitat:
Das macht man ja auch nicht wenn man normale Bitmaps laden tut. Ich denke auch nicht das man hier etwas manipulieren sollte und ob sich da letztendlich was tut mag dahingestellt sein. Aber gut hier die für JPG!
Delphi-Quellcode:
function CreateTexture(Width, Height, Format: word; pData: Pointer): integer;
var Texture: GLuint; begin glGenTextures(1, @Texture); glBindTexture(GL_TEXTURE_2D, Texture); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); {Texture blends with object background} glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); { only first two can be used } glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); { all of the above can be used } if Format = GL_RGBA then gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, pData) else gluBuild2DMipmaps(GL_TEXTURE_2D, 3, Width, Height, GL_RGB, GL_UNSIGNED_BYTE, pData); Result := Texture; end;
Delphi-Quellcode:
gruss
function LoadJPGTexture(Filename: string; var Texture: GLuint;
LoadFromResource: boolean): boolean; var Data: array of longword; W, Width: integer; H, Height: integer; BMP: TBitmap; JPG: TJPEGImage; C: longword; Line: ^longword; ResStream: TResourceStream; // used for loading from resource begin Result := False; JPG := TJPEGImage.Create; if LoadFromResource then // Load from resource begin try ResStream := TResourceStream.Create(hInstance, PChar(copy(Filename, 1, Pos('.', Filename) - 1)), 'JPEG'); JPG.LoadFromStream(ResStream); ResStream.Free; except on EResNotFound do begin MessageBox(0, PChar('File not found in resource - ' + Filename), PChar('JPG Texture'), MB_OK); Exit; end else begin MessageBox(0, PChar('Couldn''t load JPG Resource - "' + Filename + '"'), PChar('BMP Unit'), MB_OK); Exit; end; end; end else begin try JPG.LoadFromFile(Filename); except MessageBox(0, PChar('Couldn''t load JPG - "' + Filename + '"'), PChar('BMP Unit'), MB_OK); Exit; end; end; // Create Bitmap BMP := TBitmap.Create; BMP.pixelformat := pf32bit; BMP.Width := JPG.Width; BMP.Height := JPG.Height; BMP.canvas.draw(0, 0, JPG); // Copy the JPEG onto the Bitmap // BMP.SaveToFile('D:\test.bmp'); Width := BMP.Width; Height := BMP.Height; SetLength(Data, Width * Height); for H := 0 to Height - 1 do begin Line := BMP.scanline[Height - H - 1]; // flip JPEG for W := 0 to Width - 1 do begin c := Line^ and $FFFFFF; // Need to do a color swap Data[W + (H * Width)] := (((c and $FF) shl 16) + (c shr 16) + (c and $FF00)) or $FF000000; // 4 channel. Inc(Line); end; end; BMP.Free; JPG.Free; Texture := CreateTexture(Width, Height, GL_RGBA, addr(Data[0])); SetLength(Data, 0); Result := True; end; |
AW: Beschleunigung von Laderoutine
Zitat:
> wie 0 dann halt ändert aber nichts an meinem Problem. Und ja es ist eine Liste kein Array.. (obwohl die liste letztendlich auch aus einem besteht.) Solltest du das Array QuadTexture meinen. Ja das ist ein Array auf GLUint und hat seine Berechtigung. Ich habe keinen Bock zwischen Strings und GLUint herum zu jonglieren. gruss |
AW: Beschleunigung von Laderoutine
So geht's jetzt.
Mal sehen ob ich an anderer stelle noch was optimieren kann.
Delphi-Quellcode:
Danke für die Hilfe..
// is ShowCover
if ShowCover then begin if CoverPath <> '' then begin if CoverPath <> Path then ScanDirectory(CoverPath, 'jpg, jpeg, png', False); if aCovers.count > 0 then LstCoverPath.Clear; if (aCovers.count > QuadCount) then begin // delete first Cover aCovers.Delete(0); // move textures from destination to source for I := 0 to (aCovers.count - 1) do begin quadTexture[I] := quadTexture[I + 1]; // add to List LstCoverPath.Add(aCovers[I]); // Load last Testure if I = (QuadCount - 1) then begin // extract Filename aFileName := ExtractFileName(aCovers[I]); // extract extension aFileName := Copy(aFileName, 1, Length(aFileName) - Length(ExtractFileExt(aFileName))); // uppercase aFileName := AnsiUpperCase(aFileName); Name := ExtractFileName(GetAlbumArtistName); if Name <> '' then Name := Copy(Name, 1, Length(Name) - Length(ExtractFileExt(Name))); if (aFileName = 'FOLDER') or (aFileName = Name) then begin if quadTexture[I] <> NoCoverTexture then glDeleteTextures(1, @quadTexture[I]); LoadTexture(aCovers[I], quadTexture[I], False); end; end; end; end else begin for I := 0 to (aCovers.count - 1) do begin // extract Filename aFileName := ExtractFileName(aCovers[I]); // extract extension aFileName := Copy(aFileName, 1, Length(aFileName) - Length(ExtractFileExt(aFileName))); // uppercase aFileName := AnsiUpperCase(aFileName); Name := ExtractFileName(GetAlbumArtistName); if Name <> '' then Name := Copy(Name, 1, Length(Name) - Length(ExtractFileExt(Name))); if (aFileName = 'FOLDER') or (aFileName = Name) then begin if quadTexture[I] = NoCoverTexture then LoadTexture(aCovers[I], quadTexture[I], False); // add to List LstCoverPath.Add(aCovers[I]); end; end; // end for i end; transAlpha := 1.0; if (LastAddCover = 0) or (LastAddCover = Round(NoCoverTexture)) then Result := False; if LstCoverPath.count <> 0 then begin InitAlbumIniPath; SaveINI; end; end; end; //end ShowCover gruss |
AW: Beschleunigung von Laderoutine
OK...
Warum speicherst Du nicht die fertigen Data's Dann brauchst Du nur die Pointer um legen... |
AW: Beschleunigung von Laderoutine
Zitat:
Bei den Covers mache ich es ja schon. Und wenn es am spielen ist ändern diese sich immer abhängig vom Album natürlich das gerade wechselt. Es ist jetzt zumindest so das die Texturen wechseln wenn das Lied abspielt und nicht erst ein paar Sekunden später. Nur am Anfang werden alle Covers geladen dann nur noch jeweils eins. gruss |
AW: Beschleunigung von Laderoutine
Was Mavarik meint ist wohl folgendes:
Warum lädst und erzeugst du die Texturen für jedes Abspielen eines einzelnen Songs neu? Es wäre doch sinnvoller, beim "Betreten" eines Albumordners einmalig das JPEG zu laden und die Textur zu erzeugen und abzuspeichern. Hierfür würde sich das erwähnte Dictionary anbieten mit den Albumordner-string als Key und die OpenGL-Texture als Value. |
AW: Beschleunigung von Laderoutine
Zitat:
Ist das Album im Karussell enthalten wird nichts geladen da im Array QuadTextures vorhanden. Dann werden die Texturen jetzt lediglich im Array verschoben so das ich sie nicht neu laden muss. Wie gesagt NUR dann wenn nicht vorhanden wird geladen. Da ist mit Dictionary nichts zu machen. Es würde viel zu lange dauern 1000 Alben beim Start in ein Dictionary einzulesen und dann zu vergleichen wenn ein neuer Titel abgespielt wird. So speichere ich nur die 25 Alben bzw. so viele wie sich im Karussell befinden ab 5 und aufwärts max 25 Zudem habe ich keinen Einfluss darauf welches Album gerade gespielt wird. Das ist ein Plugin das sich die Daten über die Audio-Anwendung holt welche dieses verwendet. Zitat:
Letztendlich ist das auch nur ein *.jpg oder anderer typ. Warum soll ich diese dann abspeichern wenn sie schon im Albums Pfad vorhanden ist. Die Texture ID bringt mir gar nichts. gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz