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
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

AW: Beschleunigung von Laderoutine

  Alt 16. Aug 2016, 09:59
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:
if aCovers.count > -1 then
Eine Liste hat immer mehr als -1 Einträge
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#2

AW: Beschleunigung von Laderoutine

  Alt 16. Aug 2016, 10:16
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:
if aCovers.count > -1 then
Eine Liste hat immer mehr als -1 Einträge
Ja du hast Recht Ka was mich da geritten hat..
> 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

Geändert von EWeiss (16. Aug 2016 um 10:37 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: Beschleunigung von Laderoutine

  Alt 16. Aug 2016, 11:07
So geht's jetzt.
Mal sehen ob ich an anderer stelle noch was optimieren kann.

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 > 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
Danke für die Hilfe..

gruss

Geändert von EWeiss (16. Aug 2016 um 11:29 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

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

AW: Beschleunigung von Laderoutine

  Alt 16. Aug 2016, 11:17
OK...

Warum speicherst Du nicht die fertigen Data's

Dann brauchst Du nur die Pointer um legen...
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: Beschleunigung von Laderoutine

  Alt 16. Aug 2016, 11:31
OK...

Warum speicherst Du nicht die fertigen Data's

Dann brauchst Du nur die Pointer um legen...
Ich weiß jetzt nicht welche Daten du meinst die ich abspeichern soll.
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

Geändert von EWeiss (16. Aug 2016 um 11:34 Uhr)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.075 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Beschleunigung von Laderoutine

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

n/a Beiträge
 
#7

AW: Beschleunigung von Laderoutine

  Alt 16. Aug 2016, 12:39
Zitat:
Warum lädst und erzeugst du die Texturen für jedes Abspielen eines einzelnen Songs neu?
Tue ich ja nicht nur am Anfang irgendwie muss ich ja mein QuadTexture Array mit Daten füllen.

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:
Es wäre doch sinnvoller, beim "Betreten" eines Albumordners einmalig das JPEG zu laden und die Textur zu erzeugen und abzuspeichern.
Ich tue nichts anderes nur die Texture abspeichern halte ich für unnötig.
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

Geändert von EWeiss (16. Aug 2016 um 12:47 Uhr)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.075 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Beschleunigung von Laderoutine

  Alt 16. Aug 2016, 15:40
Zitat:
Warum lädst und erzeugst du die Texturen für jedes Abspielen eines einzelnen Songs neu?
Tue ich ja nicht nur am Anfang irgendwie muss ich ja mein QuadTexture Array mit Daten füllen.

Ist das Album im Karussell enthalten wird nichts geladen da im Array QuadTextures vorhanden.
Warum?
Behalte doch einfach die OpenGL-Texture während der Laufzeit des Plug-Ins?
Wenn ich das richtig verstehe, schmeißt du ja die Texturen weg, sobald die Grenze von (aCovers.count > QuadCount) überschritten ist.
Der Flaschenhals ist ja das übertragen des JPEG-Bildes auf das Bitmap-Bild.
Hier kannst du übrigens ein paar Zeilen einsparen:

Anstatt:
Delphi-Quellcode:
  // 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
Kannst du auch das schreiben:
Delphi-Quellcode:
  BMP := TBitmap.Create;
  BMP.Pixelformat := pf32bit;
  BMP.Assign(JPG);
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.
Musst ja nicht beim Start über den ganzen Root-Ordner suchen, hat auch keiner vorgeschlagen.
Das Vergleichen mit den neuen Titel/Albumpfad ist übrigens super schnell per TDictonary.

Ich tue nichts anderes nur die Texture abspeichern halte ich für unnötig.
Wäre doch aber sinnvoller, da das neuladen ja anscheinend deine Performance-Bremse ist.

Letztendlich ist das auch nur ein *.jpg oder anderer typ.
Warum soll ich diese dann abspeichern wenn sie schon im Albums Pfad vorhanden ist.
Ich glaube du hast das falsch verstanden. Nicht abspeichern im Sinne von "auf die Festplatte schreiben" sondern abspeichern im Sinne von: im Arbeitsspeicher halten! Siehe TDictionary.
  Mit Zitat antworten Zitat
Antwort Antwort


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 04:40 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