AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Möglichkeit große Bilder im Speicher zu halten [Andorra]
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von Zerolith · begonnen am 28. Mai 2009 · letzter Beitrag vom 1. Jun 2009
Antwort Antwort
Zerolith

Registriert seit: 12. Mär 2003
Ort: Kempten
188 Beiträge
 
Delphi 6 Enterprise
 
#1

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

  Alt 28. Mai 2009, 16:27
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;
Daniel
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#2

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

  Alt 28. Mai 2009, 17:59
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
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat
Zerolith

Registriert seit: 12. Mär 2003
Ort: Kempten
188 Beiträge
 
Delphi 6 Enterprise
 
#3

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

  Alt 28. Mai 2009, 18:15
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?
Daniel
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#4

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

  Alt 28. Mai 2009, 18:41
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 von Zerolith:
16 Bit klingt schon mal nicht schlecht, wie siehts dann mit Alpha Transparenz aus?
4 Bit pro Kanal ARGB

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 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.
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat
Zerolith

Registriert seit: 12. Mär 2003
Ort: Kempten
188 Beiträge
 
Delphi 6 Enterprise
 
#5

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

  Alt 1. Jun 2009, 12:37
Nochmals herzlichen Dank,

wenn ich die Tage mal wieder Zeit finde werde ich die Skalierung mit GR32 testen.
Daniel
  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 00:34 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