![]() |
Beschleunigung von Laderoutine
Meine Laderoutine..
Delphi-Quellcode:
Hat jemand eine Idee wie man das beschleunigen könnte.?
// is ShowCover
if ShowCover then begin if CoverPath <> '' then begin if CoverPath <> Path then ScanDirectory(CoverPath, 'jpg, jpeg, png', False); if aCovers.count > -1 then begin LstCoverPath.Clear; LstQuadTexture.Clear; end; if (aCovers.count <= QuadCount) then 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(GetAlbumArtisName); 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); LstQuadTexture.Add(IntToStr(quadTexture[I])); LstCoverPath.Add(aCovers[I]); end; end; // end for i transAlpha := 1.0; if (LastAddCover = 0) or (LastAddCover = Round(NoCoverTexture)) then Result := False; if LstCoverPath.count <> 0 then begin InitAlbumIniPath; SaveINI; end; exit; // exit For end else // else aCovers.count begin if (aCovers.count > QuadCount) then begin aCovers.Delete(0); for I := 0 to (aCovers.count - 1) do begin // extract Filename aFileName := ExtractFileName(aCovers[I]); // without extension aFileName := Copy(aFileName, 1, Length(aFileName) - Length(ExtractFileExt(aFileName))); aFileName := AnsiUpperCase(aFileName); Name := AnsiUpperCase(GetAlbumArtisName); 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 + 1]); LoadTexture(aCovers[I], quadTexture[I], False); LstQuadTexture.Add(IntToStr(quadTexture[I])); LstCoverPath.Add(aCovers[I]); end; end; // end for i transAlpha := 1.0; if LstCoverPath.count <> 0 then begin InitAlbumIniPath; SaveINI; end; end; // end aCovers.count end; // end else aCovers.count end; // end CoverPath end; //end ShowCover Das Problem ist das ich bei jeder neu eingelegten CD (Abspielen eines Albums) Alle Covers neu eingelesen und zugeordnet werden müssen da ich das erste Cover des Karussells lösche um am ende ein neues zu addieren. Aber nur dann wenn das Cover sich noch nicht im Karussell befindet. Mir fällt im Moment keine schnellere Lösung ein. Was die Anwendung blockt ist LoadTexture. Den Prozess weiterlaufen lassen bringt keine Abhilfe weil man dann das ersetzen jedes Cover sehen kann. gruss |
AW: Beschleunigung von Laderoutine
OK..
Ich habe es zumindest schon mal verkleinert. Wegen 1 Zeile
Delphi-Quellcode:
aCovers.Delete(0);
einen else Part einzurichten war nicht gerade gut durchdacht. Das kann ich mir dann auch sparen..
Delphi-Quellcode:
if (aCovers.count <= QuadCount) then
Delphi-Quellcode:
Aber schneller ist das trotzdem nicht.
if CoverPath <> '' then
begin if CoverPath <> Path then ScanDirectory(CoverPath, 'jpg, jpeg, png', False); if aCovers.count > -1 then begin LstCoverPath.Clear; LstQuadTexture.Clear; end; if (aCovers.count > QuadCount) then aCovers.Delete(0); 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(GetAlbumArtisName); 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); LstQuadTexture.Add(IntToStr(quadTexture[I])); LstCoverPath.Add(aCovers[I]); end; end; // end for i 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
Hmm..
Wann ändert sich der CoverPath? Ändern sich die Bilder im CoverPath? Wenn sich daran nichts seit Programmstart ändert, dann mach das ScanDirectory() nur einmal bei Programmstart und nicht bei jedem Wechsel. Ist ein CD-Wechsel immer nur die nächste/vorherige CD ? Wenn Ja, dann behalte doch die aktuell angezeigten Covers bereits aufbereitet im Speicher und verwerfe immer nur das herausfallende um dann das eine neue nach zu laden. Derzeit werden jedes mal alle Bilder neu geladen. |
AW: Beschleunigung von Laderoutine
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
1. Zu beginn wird das Karussell mit NoCoverTexturen gefüllt TextureID(20). 2. Ändert sich ein Album wird geprüft ob an der aktuellen Position eine NoCoverTexturen verwendet wird. 3. Wenn ja wird diese mit dem Cover ersetzt wenn vorhanden, solange bis alle NoCoverTexturen mit Covers belegt sind. 4. Sind im Karussell alle NoCoverTexturen gefüllt und der Counter mehr wie die maximale Anzahl an Covern wird das erste Cover gelöscht und die anderen um einen platz nach hinten verschoben so das an letzter Position das alte durch das neue ersetzt wird. 5. Ist ein Cover vorhanden wird dieses verwendet ohne die alten zu ersetzen. 6. Ist kein Cover vorhanden dann wird die NoCoverTexturen für den Hintergrund verwendet die Covers im Karussell ändern sich dann nicht. Es ist so eingerichtet das nicht immer das letzte ersetzt wird sondern alle Cover um eins nach hinten verschoben werden. So hat man die Möglichkeit innerhalb von 25 Alben eines der vorherig verwendeten nochmals zum spielen auszuwählen. Hmm.. :idea: Müsste mal versuchen ob ich die vorherigen Covers mit den alten umstrukturieren kann ohne diese zu laden. Noch keine Ahnung wie das dann mit dem Speicher aussieht wenn die vorherigen nicht gelöscht werden. gruss |
AW: Beschleunigung von Laderoutine
Ich nehme an, du lädst jedes Mal z.b. bei Punkt 4 alle Cover neu? Falls ja, könntest du dein Array mit den Texturen auch als RingBuffer behandeln und nur intern eine Shift-Value verwalten, die angibt, an welcher Stelle des Arrays der "echte" Anfang zu finden ist. Dein Carousel renderst du dann nicht statisch von
Delphi-Quellcode:
zu
Low(Array)
Delphi-Quellcode:
, sondern einmal von
High(Array)
Delphi-Quellcode:
bis
Array[StartIndex]
Delphi-Quellcode:
und dahinter noch einmal von
High(Array)
Delphi-Quellcode:
bist
Low(Array)
Delphi-Quellcode:
.
Array[StartIndex - 1]
Sowas in der Art: ![]() Wobei du dir das Ende nicht merken musst, da bei dir die leeren Elemente ja mit der NoTexture aufgefüllt werden. |
AW: Beschleunigung von Laderoutine
Zitat:
Das mit ScanDirectory ist das kleinste Problem damit wird ja nur das nächste Cover gesucht. welches den Namen FOLDER bzw.. "Album - Artist" haben kann. "Folder.jpg" oder "The Wall (1979) - Pink Floyd.jpg" als Beispiel. Zitat:
Also beim ersten start wenn noch keine AlbumCover.ini existiert. Wird nachher ein Pfad zu einem Bild in der INI nicht gefunden warum auch immer wird diese gelöscht und alles geht von vorne los. gruss |
AW: Beschleunigung von Laderoutine
Ohne den Source komplett nachvollzogen zu haben, eine Anregung:
Es geht doch um Anzeige?! Statt die Daten im "Karussell" zu bewegen, könnte man die Sache beschleunigen, indem man nur einen Index (also ein weiteres Array mit Verweisen auf das eigentliche Karussell) manipuliert. Habe mal so etwas für eine Anzeige eines Rennverlaufs (mit Fotos der Jockeys/Pferde) gemacht. Da kam es bei den Änderungen auf Aktualität/Geschwindigkeit an. Allerdings war die Zahl der Teilnehmer "endlich", d.h. es kamen keine neuen hinzu. Gruß |
AW: Beschleunigung von Laderoutine
Warum speicherst Du das nicht zwischen?
Erzeuge Dir ein TDictionary mit den Covernamen und dem entsprechenden Bild und genauso das Dir... Dann musst Du nur 1 Cover neu laden, rest is in Memory... |
AW: Beschleunigung von Laderoutine
Zitat:
Ich bin noch am Testen ist nicht ganz so einfach. Das letzte Cover macht mir Schwierigkeiten beim verschieben.
Delphi-Quellcode:
Das letzte ist dann nicht mehr initialisiert weil es auf den vorherigen platz verschoben wurde.
for I := 0 to (aCovers.count - 1) do
begin quadTexture[I] := quadTexture[I + 1]; Dementsprechend kann ich das auch nicht freigeben.. weil nicht mehr gültig. Siehe Anhang! Anfang und Ende.. EDIT: Unterumständen muss ich dann die länge des Arrays neu setzen also den 24 Eintrag entfernen. Werde nochmal testen. (bringt nix) gruss |
AW: Beschleunigung von Laderoutine
OK- Ich verstehe nicht so ganz was Du da machst, aber eigentlich sollte das - so schnell sein, dass Du keine Verzögerung merkst... Von was sprechen wir hier?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:07 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