Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Möglichkeit große Bilder im Speicher zu halten [Andorra] (https://www.delphipraxis.net/134775-moeglichkeit-grosse-bilder-im-speicher-zu-halten-%5Bandorra%5D.html)

Zerolith 28. Mai 2009 15:27


Möglichkeit große Bilder im Speicher zu halten [Andorra]
 
Hallo zusammen,

Ich hab mir eine kleine Komponente entwickelt, auf der mit Andorra2D mehrere Bilder gerendert werden.
Diese lade ich zuvor von "thetvdb.com" (Größe: 680x1000px als JPG) und speicher sie lokal in einer Cache-Datei.
Der ganze Weg bis dahin (suchen, download+speichern) ist relativ fix und stört das Programm in keinster Weise.

Ursprünglich wollte ich eigentlich eine VCL Komponente bauen, da das Ding aber schon bei 10 Bildern (die ich (einmalig) mit GR32 runterskaliert habe) in die Knie. Und da ich auch ein paar schöne Visuelle Effekte hinzufügen wollte bin ich auf Andorra umgestiegen.

Erster Versuch war mit der Andorra Sprite-Engine, war mir zu langsam war (zusätzlich hatte ich ein paar Probleme den Bild-lade-Vorgang (Thread) zu Synchronisieren.

Jetzt hab ich nur eine AdImageList in die ich die (25 Bilder) lade und diese dann mit AdImage.DrawAlpha ausgebe. Soweit ja ganz schön und toll. Nur schießt der Speicherverbrauch über 100 MB hinaus und das gefällt mir nicht ganz.

Mein erster Gedanke war, ob es eventuell möglich ist die Bilder in der AdImageList auf eine definierte Größe zu verkleinern und sobald eine größere Zoomstufe gewählt wird diese neu zu laden und erneut verkleinern.

Geil wären natürlich (Andorra) Hausmittel, da der Weg z.B. über GR32 wieder Zeit kostet.

Daniel


Falls jemand Vorschläge für die VCL Lösung hat, hier ein paar Angaben dazu:

Der Ursprüngliche Weg (VCL Komponente) steht natürlich auch noch zur Wahl, sofern mir jemand bei diesen Problemen helfen kann:
- "Flackern" bei Resize / Zoom / Scrollen
- Bei anderen Komponenten zeichne ich bisher immer im WM_Paint Event, mit der BitBlt Funktion
- Zusätzlich zeichnet meine Paint Funktion NUR den sichtbaren Bereich der Komponente
- Auch hier war das Problem mit dem hohen Speicherverbrauch für die Bilder und zusätzlich dass das Zeichnen recht langsam war

hier mal der Ausschnitt meiner "alten" VCL Zeichenfunktion
Delphi-Quellcode:

// wall => TBitmap32 (bei Komponenten Erstellung instanziert, im Resize werden Width+Height auf Komponenten Eigenschaften gesetzt)
//wall wird im Paint ereignis via BitBlt auf den Canvas der Komponente kopiert
//( der weg ist nur weil ich in der DrawItem Funktion schneller auf Bitmap32 als auf Bitmap zeichnen kann)

// PreparePoster gibt das (verkleinerte) Bild zurück
// wird nur beim 1ten Aufruf verkleinert

    w := (Width - ((fColumns + 1) * PADDING)) div fColumns;
    h := PreparePoster(s, w);

      r.Left := (PADDING * x) + (Max(0, (x - 1)) * w);
      r.Top := (PADDING * y) + ((y - 1) * h);
      r.Right := r.Left + w;
      r.Bottom := r.Top + h;

      BitBlt(wall.Canvas.Handle, r.Left, r.Top, r.Right - r.Left, r.Bottom - r.Top, TBitmap32(s.Poster).Canvas.Handle, 0, 0, SRCCOPY);
//  CopyRect war noch langsamer als BitBlt
//      FSave.Canvas.CopyMode := cmSrcCopy;
//      FSave.Canvas.CopyRect(r, TBitmap32(s.Poster).Canvas, TBitmap32(s.Poster).Canvas.ClipRect);
    end;

igel457 28. Mai 2009 16:59

Re: Möglichkeit große Bilder im Speicher zu halten [Andorra]
 
Hallo,

der Speicherverbrauch von 100 MB ist realistisch: Die Bilder müssen auf eine Auflösung von 1024*1024 hoch skaliert werden, da die meisten Grafikkarten nur Texturen mit der Größe 2^n unterstützen. Zum drastischen Minimieren der Speicherauslastung würde ich die Bilder also z.B. auf 512*752 skalieren. Wenn du sie dann noch mit 16-Bit Farbtiefe (ein Dithering-Algorithmus befindet sich in der Unit AdBitmapEffects) speicherst, hast du den Speicherverbrauch auf ein viertel Reduziert.

Das einzige, was ich dir sonst raten kann, ist die Bilder in kleiner Auflösung zu speichern und bei der Anzeige des Bildes eine höher aufgelöste Version in einem Thread zu laden. Momentan unterstützt Andorra 2D leider noch keine komprimierten Bilddaten, sonst würde ich dir empfehlen diese zu verwenden.

Andreas

Zerolith 28. Mai 2009 17:15

Re: Möglichkeit große Bilder im Speicher zu halten [Andorra]
 
Hi und Danke schonmal,

- kann ich mit Andorra das AdImage nach dem laden skalieren?
- 16 Bit klingt schon mal nicht schlecht, wie siehts dann mit Alpha Transparenz aus?
- 512*752 ? => würde das dann nichta uch auf 1024*1024 skaliert werden? Sollte ich nicht <=512 bei Höhe + Breite gehen um das zu verhindern?
- Rein Theoretisch: Wie / Wo würde man Andorra um Komprimierte Bilder erweitern?

igel457 28. Mai 2009 17:41

Re: Möglichkeit große Bilder im Speicher zu halten [Andorra]
 
Zitat:

Zitat von Zerolith
kann ich mit Andorra das AdImage nach dem laden skalieren?

Nein, das ist nicht implementiert - da wirst du auf GR32 ausweichen müssen.

Zitat:

Zitat von Zerolith
16 Bit klingt schon mal nicht schlecht, wie siehts dann mit Alpha Transparenz aus?

4 Bit pro Kanal ARGB

Zitat:

Zitat von Zerolith
512*752 ? => würde das dann nichta uch auf 1024*1024 skaliert werden? Sollte ich nicht <=512 bei Höhe + Breite gehen um das zu verhindern?

512x752 wird auf 512x1024 skaliert - also halb so groß wie die alte Version.

Zitat:

Zitat von Zerolith
Rein Theoretisch: Wie / Wo würde man Andorra um Komprimierte Bilder erweitern?

Das benötigt eine Erweiterung um einen Bilddatenkomprimierer für S3TC sowie die Erweiterung der Plugins. Ich würde die Arbeit der Kompression dem Plugin überlassen, und das Flag für die Kompression genauso wie das Flag für 16/32 Bit übergeben.

Zerolith 1. Jun 2009 11:37

Re: Möglichkeit große Bilder im Speicher zu halten [Andorra]
 
Nochmals herzlichen Dank,

wenn ich die Tage mal wieder Zeit finde werde ich die Skalierung mit GR32 testen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:09 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