Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Beschleunigung von Laderoutine (https://www.delphipraxis.net/189976-beschleunigung-von-laderoutine.html)

EWeiss 15. Aug 2016 18:51

Beschleunigung von Laderoutine
 
Meine Laderoutine..

Delphi-Quellcode:
  // 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
Hat jemand eine Idee wie man das beschleunigen könnte.?
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

EWeiss 15. Aug 2016 20:49

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:
    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
Aber schneller ist das trotzdem nicht.

gruss

HolgerX 16. Aug 2016 04:31

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.

EWeiss 16. Aug 2016 04:57

AW: Beschleunigung von Laderoutine
 
Zitat:

Wann ändert sich der CoverPath?
Immer sobald sich das Album ändert.

Zitat:

Ändern sich die Bilder im CoverPath?
Selbe wie oben.

Zitat:

dann mach das ScanDirectory() nur einmal bei Programmstart und nicht bei jedem Wechsel.
Muss ich immer machen sobald sich ein Titel ändert sonst finde ich das Cover im Albumpfad nicht.

Zitat:

Ist ein CD-Wechsel immer nur die nächste/vorherige CD ?
Nein Unterschiedlich "Random" bzw.. das was in der Playliste steht.

Zitat:

Derzeit werden jedes mal alle Bilder neu geladen.
Ja und das ist mein Problem aber es geht nicht anders zumindest sehe ich im Moment keinen anderen weg.

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

Zacherl 16. Aug 2016 05:09

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:
Low(Array)
zu
Delphi-Quellcode:
High(Array)
, sondern einmal von
Delphi-Quellcode:
Array[StartIndex]
bis
Delphi-Quellcode:
High(Array)
und dahinter noch einmal von
Delphi-Quellcode:
Low(Array)
bist
Delphi-Quellcode:
Array[StartIndex - 1]
.

Sowas in der Art:
https://en.wikipedia.org/wiki/Circul...ircular_buffer

Wobei du dir das Ende nicht merken musst, da bei dir die leeren Elemente ja mit der NoTexture aufgefüllt werden.

EWeiss 16. Aug 2016 05:17

AW: Beschleunigung von Laderoutine
 
Zitat:

Zitat von Zacherl (Beitrag 1344944)
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:
Low(Array)
zu
Delphi-Quellcode:
High(Array)
, sondern einmal von
Delphi-Quellcode:
Array[StartIndex]
bis
Delphi-Quellcode:
High(Array)
und dahinter noch einmal von
Delphi-Quellcode:
Low(Array)
bist
Delphi-Quellcode:
Array[StartIndex - 1]
.

Sowas in der Art:
https://en.wikipedia.org/wiki/Circul...ircular_buffer

Danke werde das mal als Ansatz nehmen um das ZU häufige laden der Texturen zu vermeiden.
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:

Wobei du dir das Ende nicht merken musst, da bei dir die leeren Elemente ja mit der NoTexture aufgefüllt werden.
Nein ganz so ist es nicht diese sind bzw. bleiben nur mit NoTexture gefüllt solange sie nicht mit Covern ersetzt wurden.
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

Billa 16. Aug 2016 06:31

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ß

Mavarik 16. Aug 2016 07:47

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...

EWeiss 16. Aug 2016 09:22

AW: Beschleunigung von Laderoutine
 
Zitat:

Zitat von Mavarik (Beitrag 1344947)
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...

Ich erzeuge ja schon zwei TStringList und speichere die Daten zwischen..

Ich bin noch am Testen ist nicht ganz so einfach.
Das letzte Cover macht mir Schwierigkeiten beim verschieben.

Delphi-Quellcode:
        for I := 0 to (aCovers.count - 1) do
        begin
          quadTexture[I] := quadTexture[I + 1];
Das letzte ist dann nicht mehr initialisiert weil es auf den vorherigen platz verschoben wurde.
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

Mavarik 16. Aug 2016 09:54

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:54 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz