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
TiGü

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

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

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.081 Beiträge
 
Delphi 10.4 Sydney
 
#3

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
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: Beschleunigung von Laderoutine

  Alt 16. Aug 2016, 15:51
Kannst mir das mal als Beispiele auf meine Routine übertragen?
So das ich das mal testen kann.

Ich bin mir auch nicht sicher ob D2010 TDictionary unterstützt (Habe es vorher noch nicht verwendet.)
Ok gibt es..

Zitat:
im Arbeitsspeicher halten! Siehe TDictionary.
Ah jo so wie ich sie im Array halte..

Zitat:
Behalte doch einfach die OpenGL-Texture während der Laufzeit des Plug-Ins?
Die frage wäre dann hier wie lange macht der Speicher das mit wenn ich innerhalb von 5 > 6 Stunden die ganzen Covers lade und im Speicher halte.

Das!
Delphi-Quellcode:
  BMP := TBitmap.Create;
  BMP.Pixelformat := pf32bit;
  BMP.Assign(JPG);
geht nicht.
Danach wird mein Plugin einfach beendet.

gruss

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

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

AW: Beschleunigung von Laderoutine

  Alt 17. Aug 2016, 10:38
Kannst mir das mal als Beispiele auf meine Routine übertragen?
So das ich das mal testen kann.
Du pflegst ja eher einen struktuierten Programmierstil, daher so:

Delphi-Quellcode:
...

uses
  System.Generics.Collections;

...

var
  EWeissCoverDictionary: TDictionary<string, GLuint>;

procedure Construct;
begin
  EWeissCoverDictionary := TDictionary<string, GLuint>.Create;
end;

procedure LoadCovers(const CoverPath: string; out Texture: GLuint);
begin
  if not EWeissCoverDictionary.TryGetValue(CoverPath, Texture) then
  begin
    LoadTexture(CoverPath, Texture, False);
    EWeissCoverDictionary.Add(CoverPath, Texture);
  end;
end;

procedure MachKaputtWasEuchKaputtMacht;
var
  Texture: GLuint;
begin
  for Texture in EWeissCoverDictionary.Values do
  begin
    glDeleteTextures(1, @Texture);
  end;
  EWeissCoverDictionary.Free;
end;
Das!
Delphi-Quellcode:
  BMP := TBitmap.Create;
  BMP.Pixelformat := pf32bit;
  BMP.Assign(JPG);
geht nicht.
Danach wird mein Plugin einfach beendet.
Haste dir schonmal nen try-except darum gebastelt und dir die Exception.Message ausgeben lassen?
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: Beschleunigung von Laderoutine

  Alt 17. Aug 2016, 11:42
Zitat:
EWeissCoverDictionary
Cool so bin ich verewigt.

Werde es mir mal anschauen danke für das Beispiel.
Obwohl ich eigentlich mit dem aktuellen Stand zufrieden bin.
Hab das Teil im Hintergrund so ca. 5 Stunden laufen lassen.
Keine Probleme und der speicherverbrauch liegt so bei 48 MB.

EDIT:
Habe mir da mal angeschaut.

Letztendlich ist es so das es keinen sinn macht alle Covers incl. Texturen zu speichern.
Im habe maximal 25 Cover im Karussell wird das 26 Geladen dann wird das erste gelöscht
die anderen rücken dann nach und das 25 ist das aktuell spielende Album.
Wenn ich das erste Cover lösche welchen sinn macht es dann dieses gespeichert zu lassen
es kann aus dem Plugin dann nicht mehr abgespielt werden.

Der sinn des Karussell ist das man ein beliebiges Album nochmals spielen kann.
Ein gelöschtes Album kann man aber nicht mehr spielen von daher muss ich es auch nicht abspeichern
weder im Array, Dictionary noch in einer Datei.

Trotz allem ist schon interessant.

gruss

Geändert von EWeiss (17. Aug 2016 um 12:13 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

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

AW: Beschleunigung von Laderoutine

  Alt 17. Aug 2016, 14:06
Bei der von mir vorgeschlagenen Lösung würdest du jeweils maximal 25 Texturen behalten, aber müsstest trotzdem immer nur Eine neu laden.

Init:
Delphi-Quellcode:
InsertIndex := 0;
for I := Low(TextureArray) to High(TextureArray) do
begin
  TextureArray[I] := NoCoverTexture;
end;
Neues Album laden:
Delphi-Quellcode:
if (TextureArray[InsertIndex] <> NoCoverTexture) then
begin
  DeleteTexture(TextureArray[InsertIndex]);
end;
LoadTexture(Pfad, TextureArray[InsertIndex]);
Inc(InsertIndex);
if (InsertIndex = Length(A)) then
begin
  InsertIndex := Low(A);
end;
Zeichnen vom Carousel:
Delphi-Quellcode:
for I := InsertIndex to High(TextureArray) do
begin
  RenderTexture(TextureArray[I]);
end;
for I := Low(TextureArray) to InsertIndex - 1 do
begin
  RenderTexture(TextureArray[I]);
end;
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
TiGü

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

AW: Beschleunigung von Laderoutine

  Alt 17. Aug 2016, 17:01
Letztendlich ist es so das es keinen sinn macht alle Covers incl. Texturen zu speichern.
Im habe maximal 25 Cover im Karussell wird das 26 Geladen dann wird das erste gelöscht
die anderen rücken dann nach und das 25 ist das aktuell spielende Album.
Wenn ich das erste Cover lösche welchen sinn macht es dann dieses gespeichert zu lassen
es kann aus dem Plugin dann nicht mehr abgespielt werden.
Lösche doch einfach nicht???
  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 07:49 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