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

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

AW: Beschleunigung von Laderoutine

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

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

AW: Beschleunigung von Laderoutine

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

n/a Beiträge
 
#13

AW: Beschleunigung von Laderoutine

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

n/a Beiträge
 
#14

AW: Beschleunigung von Laderoutine

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

n/a Beiträge
 
#15

AW: Beschleunigung von Laderoutine

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

n/a Beiträge
 
#16

AW: Beschleunigung von Laderoutine

  Alt 16. Aug 2016, 12: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 12:29 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
 
#17

AW: Beschleunigung von Laderoutine

  Alt 16. Aug 2016, 12: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
 
#18

AW: Beschleunigung von Laderoutine

  Alt 16. Aug 2016, 12: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 12:34 Uhr)
  Mit Zitat antworten Zitat
TiGü

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

AW: Beschleunigung von Laderoutine

  Alt 16. Aug 2016, 13: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
 
#20

AW: Beschleunigung von Laderoutine

  Alt 16. Aug 2016, 13: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 13:47 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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:06 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