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

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

AW: Beschleunigung von Laderoutine

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

n/a Beiträge
 
#2

AW: Beschleunigung von Laderoutine

  Alt 16. Aug 2016, 05: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 05:32 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Billa
Billa

Registriert seit: 11. Aug 2003
239 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: Beschleunigung von Laderoutine

  Alt 16. Aug 2016, 06: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.164 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Beschleunigung von Laderoutine

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

AW: Beschleunigung von Laderoutine

  Alt 16. Aug 2016, 09: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 15:44 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

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

AW: Beschleunigung von Laderoutine

  Alt 16. Aug 2016, 09: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
Benutzerbild von Neutral General
Neutral General

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

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
 
#8

AW: Beschleunigung von Laderoutine

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

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

AW: Beschleunigung von Laderoutine

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

AW: Beschleunigung von Laderoutine

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