Einzelnen Beitrag anzeigen

Benutzerbild von pustekuchen
pustekuchen

Registriert seit: 27. Aug 2010
265 Beiträge
 
Delphi 11 Alexandria
 
#12

AW: Schnelleres laden von PNGs

  Alt 9. Mär 2012, 06:44
Vielen Dank für die Zahlreichen antworten =)

.. wenn ein bestimmtes Bild geladen/angefordert wurde ist es Dir dann möglich
vorrauszusehen welche(s) Bild/Bilder als nächstes angefragt werden könnten.
Ja wäre es.

@pustekuchen: Wieso Arbeitest du nicht durchgehend mit PNG's? Haben ja mit der Semitransparenz einen großen Vorteil gegenübr PNG's.
Gut das du mich darauf nochmal aufmerksam machst. Wenn ich mich recht entsinne habe ich es so gemacht, weil ich die PNG nach BMP umwandle, diese einzelteile dann auf eine große Bitmap kopiere und dann einen Teilbereich auf eine Paintbox zeichne. Da gab nachher das Problem, das die Bilder unterschiedliche Farben hatten und das Endergebniss dann ein zusammenengewürfeltes Kunderbunt war. Wenn ich natürlich nun richtig die PNG auf die große Bitmap gezeichnet bekommen, wäre das schonmal ein großer Performance schub.

EDIT: Habs nun nochmal umgeschrieben.
Delphi-Quellcode:
if not Assigned(FPicArray[i - xMin][k - yMin].PngImage) then
          begin
            FPicArray[i - xMin][k - yMin].PngImage := TPNGImage.Create;
            FPicArray[i - xMin][k - yMin].PngImage.Transparent := false;
          end;
          FPicArray[i - xMin][k - yMin].PngImage.LoadFromFile(Path);
Dannach wird das ganze folgendermaßen Kopiert.
Delphi-Quellcode:
BitBlt(Map.Canvas.Handle, xCount, yCount, SIZE_TILE, SIZE_TILE,
            FPicArray[i][k].PngImage.Canvas.Handle, 0, 0, SRCCOPY);
Nun kommen wieder die Kunterbunten Bilder, die dann etwa so aussehen:
Klick

EDIT2: Selbe Problem

Verwende einen Cache, genauer gesagt, einen MRU-Cache. "Most Recently Used". Klingt toll, ist banal:
Du baust Dir eine Liste (verkettet z.B.) mit maximal N Elementen, oder sovielen Elementen, das maximal X Bytes Speicher verbraucht werden.
Die ist zunächst leer.

bevor Du eine PNG in eine Bitmap konvertieren willst, schaust Du im Cache nach, ob die da drin ist. Wenn ja, kommt sie an den ANFANG der Liste. Wenn nicht, wird sie erzeugt und auch an den ANFANG gepackt. Dadurch wächst die Liste. Wenn sie zu groß ist (mehr als N Elemente oder mehr als X Bytes Speicher) wird der LETZTE Eintrag der Liste verworfen.

3-2-1- Perfekt, skalierbar, schnell.

Das tolle ist ja, das die tendentiell oft benötigten Objekte vorne sind, und die selten benötigten eben tendentiell hinten. Also wird ein Cache-Miss relativ selten sein.
Das ist natürlich auch eine sehr gute Idee und würde im meinem Fall wahrscheinlich auch ein wenig helfen und dies werde ich dann auch noch implementieren.
Jedoch ist es ehr so das beim Laden der Bilder am meisten performance verloren geht und dies zuerst optimiert werden sollte.


Immer dieses Rätselraten
Je genauer Du beschreibst, was Du eigentlich vorhast, desto wahrscheinlicher ist, dass Dir jemand helfen kann. Oder ist das ein Geheimnis?

Je nach der Größe einzelner Bilder ist es sinnvoll, diese zu einem großen Bild (Tilemap) zusammenzufassen, das große Bild zu laden und anschließend den entsprechenden Bildausschnitt zu kopieren. Wie werden die einzelnen Bilder angezeigt? In verschiedenen Image-Komponenten oder in einer? Werden die Bilder zufällig ausgewählt, oder ist es absehbar, welche Bilder verwendet werden?
Ja hast schon recht =) Es stelle mit meiner Anwendung eine Karte dar, die aus Tiles besteht. Das zusammenkopieren auf eine Karte und dann einen Bildauschnitt rauszukopieren passiert bereits.

Edit: Das Kopieren geschieht mit BitBlt
Delphi programming is awesome.

Geändert von pustekuchen ( 9. Mär 2012 um 07:10 Uhr)
  Mit Zitat antworten Zitat