Delphi-PRAXiS
Seite 2 von 3     12 3      

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)

Neutral General 16. Aug 2016 09:59

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 ;)

TiGü 16. Aug 2016 10:01

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?

EWeiss 16. Aug 2016 10:07

AW: Beschleunigung von Laderoutine
 
Zitat:

OK- Ich verstehe nicht so ganz was Du da machst
Sorry aber ich verstehe nicht was du meinst.
Auf der einen Seite sagst du verstehst es nicht was ich mache aber im gleichen Atemzug
gehst du davon aus
Zitat:

aber eigentlich sollte das - so schnell sein, dass Du keine Verzögerung merkst
Zitat:

Von was sprechen wir hier?
Davon das laden der Cover zu beschleunigen..

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

EWeiss 16. Aug 2016 10:12

AW: Beschleunigung von Laderoutine
 
Zitat:

Zitat von TiGü (Beitrag 1344957)
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?

Ich möchte den Prozess des Laden nicht unterbrechen..
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:
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;
gruss

EWeiss 16. Aug 2016 10:16

AW: Beschleunigung von Laderoutine
 
Zitat:

Zitat von Neutral General (Beitrag 1344956)
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 ;)

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

EWeiss 16. Aug 2016 11:07

AW: Beschleunigung von Laderoutine
 
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

Mavarik 16. Aug 2016 11:17

AW: Beschleunigung von Laderoutine
 
OK...

Warum speicherst Du nicht die fertigen Data's

Dann brauchst Du nur die Pointer um legen...

EWeiss 16. Aug 2016 11:31

AW: Beschleunigung von Laderoutine
 
Zitat:

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

TiGü 16. Aug 2016 12:28

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.

EWeiss 16. Aug 2016 12:39

AW: Beschleunigung von Laderoutine
 
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:08 Uhr.
Seite 2 von 3     12 3      

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