AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Schnelleres laden von PNGs

Ein Thema von pustekuchen · begonnen am 8. Mär 2012 · letzter Beitrag vom 11. Mär 2012
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von pustekuchen
pustekuchen

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

Schnelleres laden von PNGs

  Alt 8. Mär 2012, 16:11
Guten Tag,

ich habe hier ein Programm in dem oft und relativ viele PNG Dateien geladen werden und dannach in eine BMP umgewandelt wird. Da man dies an der Performence des Programms merkt, such ich nun eine bessere Lösung.
Ich habe bereits eine Alternativlösung versucht und zwar alle pngs die ich habe vorher in BMP umzuwandeln. Das Ergebnis war auch spürbar, jedoch steigt dann der benötigte Speicherplatz.

Der Quellcode sieht etwa so aus
Delphi-Quellcode:

TmpPng := TPngImage.Create;
for I := xMin to xMax do
begin
  for k := yMin to yMax do
  begin
    path := 'C:\'+IntToStr(x)+'\' +IntToStr(y) +'.png'
    TmpPng.LoadFromFile(path);
    FPicArray[i - xMin][k - yMin].Image := TBitmap.Create;
    FPicArray[i - xMin][k - yMin].Image.Assign(TmpPng);
  end;
end;
TmpPng.Free;
Was natürlich auch eine Möglichkeit wäre, ist das umwandeln zu optimieren.

Über Tipps und Hilfe bin ich sehr dankbar.

Gruß
pustekuchen
Delphi programming is awesome.

Geändert von pustekuchen ( 8. Mär 2012 um 16:24 Uhr)
  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
 
#2

AW: Schnelleres laden von PNGs

  Alt 8. Mär 2012, 16:17
Naja, dass ist eben ein Naturgesetz beim Programmieren: Entweder dauerts länger oder es verbraucht mehr Speicher.

Es sind aber bei jedem Schleifendurchlauf andere Bilder ja?
Weil dein Beispielcode liese sich vereinfachen, wenn du das PNG vor der Schleife laden und konvertieren würdest.
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
Benutzerbild von pustekuchen
pustekuchen

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

AW: Schnelleres laden von PNGs

  Alt 8. Mär 2012, 16:23
Ja die Bilder sind immer unterschiedlich.

Habe eine Zeile beigefügt, die dies verdeutlicht.
Delphi programming is awesome.

Geändert von pustekuchen ( 8. Mär 2012 um 16:25 Uhr)
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#4

AW: Schnelleres laden von PNGs

  Alt 8. Mär 2012, 16:23
Gehe ich richtig davon aus, dass es ein Spiel ist? Half Life hat das Problem so gelöst in dem das Spiel an einem Punkt kurz stoppte, den Hinweis gab, dass gerade geladen wird und dann ging es weiter. Worauf ich hinaus will, was ist mit der goldenen Mitte? Den Teil konvertieren den man gerade braucht und den Rest nachladen.
  Mit Zitat antworten Zitat
Benutzerbild von pustekuchen
pustekuchen

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

AW: Schnelleres laden von PNGs

  Alt 8. Mär 2012, 16:29
Nein es handelt sich nicht um ein Spiel. Es werden bereits nur die benötigten Daten geladen. Ingesamt sind es etwa 200.000 Bilder. Es wird nur ein Bruchteil dessen geladen. Jedoch kommt es öfter vor das diese Prozedur aufgerufen wird.

P.S. Ich hab nun Feierabend. Ich werde morgen antworten =)
Delphi programming is awesome.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.196 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Schnelleres laden von PNGs

  Alt 8. Mär 2012, 16:41
Worauf ich hinaus will, was ist mit der goldenen Mitte? Den Teil konvertieren den man gerade braucht und den Rest nachladen.
Dann mach es halt so. Dein Array wird eine Klasse. Beim Zugriff auf bestimmte ID schaust du nach ob sie schon geladen ist und lädst sie wenn nicht.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.768 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Schnelleres laden von PNGs

  Alt 8. Mär 2012, 17:10
.. 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.
Wenn dem so ist, könntest Du einen Thread mit dem Nachladen beschäftigen.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.196 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Schnelleres laden von PNGs

  Alt 8. Mär 2012, 17:15
.. 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.
Wenn dem so ist, könntest Du einen Thread mit dem Nachladen beschäftigen.
Und hoffen das es nicht kracht. TBitmap verwendet ja ein GDI-Ressourcen und diese sind nur für den Thread gültig indem sei erzeugt wurden.



@pustekuchen: Wieso Arbeitest du nicht durchgehend mit PNG's? Haben ja mit der Semitransparenz einen großen Vorteil gegenübr PNG's.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.768 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Schnelleres laden von PNGs

  Alt 8. Mär 2012, 17:25
.. 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.
Wenn dem so ist, könntest Du einen Thread mit dem Nachladen beschäftigen.
Und hoffen das es nicht kracht. TBitmap verwendet ja ein GDI-Ressourcen und diese sind nur für den Thread gültig indem sei erzeugt wurden.
O.k, dass war mich nicht so bewusst.

Dann im Thread PNG nach BMP wandeln (das BMP im Thread behalten) und den Inhalt des BMP als MemoryStream an das Hauptprogramm übergeben und dort wieder in ein Bitmap einkopieren.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Iwo Asnet

Registriert seit: 11. Jun 2011
313 Beiträge
 
#10

AW: Schnelleres laden von PNGs

  Alt 8. Mär 2012, 19:01
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 13:53 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