AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Beschleunigung von Laderoutine

Ein Thema von EWeiss · begonnen am 15. Aug 2016 · letzter Beitrag vom 17. Aug 2016
Antwort Antwort
Seite 1 von 3  1 23      
EWeiss
(Gast)

n/a Beiträge
 
#1

Beschleunigung von Laderoutine

  Alt 15. Aug 2016, 19:51
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
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#2

AW: Beschleunigung von Laderoutine

  Alt 15. Aug 2016, 21:49
OK..
Ich habe es zumindest schon mal verkleinert.
Wegen 1 Zeile

aCovers.Delete(0);

einen else Part einzurichten war nicht gerade gut durchdacht.

Das kann ich mir dann auch sparen..
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

Geändert von EWeiss (15. Aug 2016 um 21:59 Uhr)
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
972 Beiträge
 
Delphi 6 Professional
 
#3

AW: Beschleunigung von Laderoutine

  Alt 16. Aug 2016, 05:31
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.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: Beschleunigung von Laderoutine

  Alt 16. Aug 2016, 05:57
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..
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

Geändert von EWeiss (16. Aug 2016 um 06:04 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#5

AW: Beschleunigung von Laderoutine

  Alt 16. Aug 2016, 06:09
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 Low(Array) zu High(Array) , sondern einmal von Array[StartIndex] bis High(Array) und dahinter noch einmal von Low(Array) bist 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.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)

Geändert von Zacherl (16. Aug 2016 um 06:11 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: Beschleunigung von Laderoutine

  Alt 16. Aug 2016, 06:17
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 Low(Array) zu High(Array) , sondern einmal von Array[StartIndex] bis High(Array) und dahinter noch einmal von Low(Array) bist 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

Geändert von EWeiss (16. Aug 2016 um 06:32 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Billa
Billa

Registriert seit: 11. Aug 2003
237 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

AW: Beschleunigung von Laderoutine

  Alt 16. Aug 2016, 07:31
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ß
Gruß Billa

Nur weil ich paranoid bin, heißt das nicht, daß die da draussen nicht hinter mir her sind....
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.144 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: Beschleunigung von Laderoutine

  Alt 16. Aug 2016, 08:47
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...
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#9

AW: Beschleunigung von Laderoutine

  Alt 16. Aug 2016, 10:22
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

Geändert von EWeiss (11. Jul 2019 um 16:44 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.144 Beiträge
 
Delphi 10.3 Rio
 
#10

AW: Beschleunigung von Laderoutine

  Alt 16. Aug 2016, 10:54
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?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:04 Uhr.
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