AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Schnelles nachladen von Bilddateien
Thema durchsuchen
Ansicht
Themen-Optionen

Schnelles nachladen von Bilddateien

Ein Thema von Memnarch · begonnen am 16. Jan 2011 · letzter Beitrag vom 23. Mai 2023
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#1

Schnelles nachladen von Bilddateien

  Alt 16. Jan 2011, 00:24
Nabend allerseits.
Wie bereits in meinem Thread über das zeichnen von Semitransparenten PNGs auf den desktop, arbeite ich an einer reprogrammierung des Touhou - BadApple Screensavers.

Wem das nichts sagt : http://www.youtube.com/watch?v=aUuCYBkt3n8

Dank der Hilfe aus dieser Community habe ich es geschafft mit LayeredWindow(s) zu arbeiten. Klappt super und bei 25bildern/sek und einer nativen auflösung von 640*480 des source materials(hatte der original screensaver auch) bin ich schneller als der originale :

Der originale verbrät 60% meiner CPU, meiner nurnoch 40-50%.

Ich weiß aber eine problemstelle bei mir die ich gerne noch behandeln würde: Das laden der Bilder. Immoment habe ich 5478 Pngs in einem ordner die einzeln geladen werden. Das braucht ein "bisschen" performance, von dem was ich weiß behaupte ich sogar es ist das meiste.

Könnte ich das mindern, indem ich zb alle bilder in eine datei packe, an den anfang eine tabelle mit den einzelnen daten schreibe(wo welches bild anfängt und wie lange es ist) diese datei in einem filestream öffne und immer die bereiche lade die ich brauche?

Was meine bisherigen erfahrungen angeht scheint es zumindest so zu sein dass es langsamer ist durch hunderte von einzelnen kleinen dateien zu rödeln als durch eine große(zumindets merkt man das beim löschen sovieler kleiner bilder, sind nur wenige hundert MBs aber braucht mehr zeit o.O).

Obiges geht natürlich nur wenn der filestream beim öffnen nicht gleich alles in den ram knallt ^^".

Die möglichkeit Dateien in eine resourcendatei zu packen dient doch nur dazu das chaos zu mindern oder wie wäre es dan damit?!

Wen jemand ideen hat, immer her damit

MFG
Memnarch
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Schnelles nachladen von Bilddateien

  Alt 16. Jan 2011, 00:41
Keine Sorge, der Filestream knallt nicht alles in dem RAM, sondern arbeitet direkt auf der Festplatte (mal abgesehen vom Windows-Cache). Es ist zu erwarten, dass das Laden schneller geht, wenn alles in einem Stück ist, statt in vielen kleinen Dateien.

Ich würde das eventuell sogar mit einem Thread lösen, und immer in Schritten z.B. fünf Dateien im Hintergrund im Voraus laden, während im Hauptthread die Bilder nacheinander angezeigt werden. Je mehr man in einem Block liest, desto schneller ist das ganze. Natürlich muss man dabei sehr genau auf Synchronisation achten und dafür sorgen, dass der Puffer nicht leer läuft bzw. auf Objekte zugegriffen wird, die noch geladen werden.
Und natürlich muss man mal wieder einen Kompromiss aus Performance und Speicherverbrauch finden.

[edit]
Wenn du die CPU-Last noch weiter reduzieren willst, könntest du eventuell auf OpenGL (oder auch Direct3D) umsteigen, und somit zumindest den Zeichenvorgang an die GPU delegieren.
[/edit]
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#3

AW: Schnelles nachladen von Bilddateien

  Alt 16. Jan 2011, 00:47
also von dem gemessenen sind kanp 50% der genutzten leistung, ladeleistung^^.

Das im block laden wird schwierig da ich nicht wirklich chronologisch durchgehe.

Ich messe die millisekunden seit starte und errechne daraus das bild da sich anzeigen muss(is ja schön durchnummeriert ). Somit gewährleiste ich unter allen umständen eine saubere synchronisation von audio und bild.

MFG
Memnarch
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#4

AW: Schnelles nachladen von Bilddateien

  Alt 16. Jan 2011, 01:03
Du kannst ja eine threadsichere Liste nehmen und die Bildnummer als Index benutzen. Beim Start reservierst du in der Liste bereits den Speicher für alle Einträge, setzt sie aber erst mal auf nil. Dann startest du den Preloader-Thread, der die Bilder lädt und in die Liste einfügt. Wenn genügend Bilder gepuffert sind, fängst du an, die Bilder wie gewohnt anzuzeigen. Nach dem Anzeigen das Bild per Free wieder freigeben. Wenn die Liste für den aktuellen Index nil zurückgibt, musst du das Bild erst laden. Dem Preloader-Thread sollte man in diesem Fall auch noch irgendwie mitteilen, dass er hinterherhinkt.

Geändert von Namenloser (16. Jan 2011 um 01:08 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#5

AW: Schnelles nachladen von Bilddateien

  Alt 16. Jan 2011, 01:38
Mh, interressante idee. Ne threadsichere liste, gibts da schon was oder muss ich da erst ran o.O(bei letzterem wirds haarig)
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Schnelles nachladen von Bilddateien

  Alt 16. Jan 2011, 02:32
Ich würd's mal mit Delphi-Referenz durchsuchenTThreadList probieren.
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#7

AW: Schnelles nachladen von Bilddateien

  Alt 16. Jan 2011, 03:17
Joar..eindeutiger name, nech?^^.
Werde ich mir nach ner mütze schlaf mal angucken(und nachdem alles in einer datei verstaut werden kann ).

Noch 2 dinge:

1) Meine bilder haben eine gesamtgroße von 500MB. jpg wärens nur 130MB, aber kein Alphakanal >.<(der muss sein).
2) etwas das ich mal ausprobiert aber wieder verforfen hatte(weil sowieso blöde idee ), ABER: ich hatte mal versucht einfach alle bilder in den ram zu klatschen. Ein bild geladen-> ab in eine tobject liste. IMMER nach exakt 260 Bildern war schluss, ungültiges bild. Das programm hatte da vllt 500KB ram eingenommen. Bin hier unter WIn7 und hattes es auchmal als Admin gestartet. Wüsste gerne für später mal was da los ist o.o.

EDIT: wnen es sowieso generell schneller ist alles aus einer datei zu laden, wie stehts dann damit, dass ich einfach alles chronologisch in die resourcen packe und daraus lade o.O. Oder hat der filestream da noch vorteile?(den ich bei einem eigenen format genommen hätte)

MFG
Memnarch

Geändert von Memnarch (16. Jan 2011 um 03:22 Uhr)
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#8

AW: Schnelles nachladen von Bilddateien

  Alt 16. Jan 2011, 03:21
Ich glaube, der Taskmanager zeigt nicht den gesamten belegten Arbeitsspeicher an, sondern nur den, der sich tatsächlich auch um RAM befindet. Ausgelagerter Speicher ist glaube ich nicht mit eingerechnet. Du kannst dir mal den Process Explorer von Sysinternals laden, der zeigt beides an.

Muss der Alphakanal denn wirklich sein? Wenn dein Material einfarbig ist wie im verlinkten Video, würden doch 2 Farben eigentlich reichen, oder?
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#9

AW: Schnelles nachladen von Bilddateien

  Alt 16. Jan 2011, 03:44
Auf den erstenblick scheint es nur 2farbig(wär ja schön, Monochrome map und transparentefarbe drüber), aber es gibt auch graustufen

Z.B. der schattenwurf bei dem intermezzo der drei damen ist semitransparent wie auch noch so einige dinge. (gibt halt farbverläufe von weiß nach schwarz). Leider kommt da ne monochrome map nicht infrage >.<

THEORETISCH wäre es möglich NUR den alpha kanal zu nehmen. Aber da wüsste ich nich wie (das möglich bezieht sich auf die getreue darstellung des bildes)

PS: und könnte ich auch anstatt nem eigenen format auch das ganze in ne resourcefile klatschen?(oder färe es per filestream doch besser es selbst zu handeln?)
PSS: Guten morgen^^ (wo bleiben nur meine Manieren )
PSSS: Und wnen ich es, wie oben erwähnt habe, schaffen würde NUR den alphakanal abspeichern und verwenden zu können. Dan wären nur ca 160MB übrig, schnelleres laden, schnellere performance.(also ich würd eigentlich mit 8Bit pro pixel auskommen..nur wie >.<)

PSSSS: IDEE: was passiert, wenn ich den Alphawert nach dem laden eines PNG "Manuell" bestimme? da ich hier ja nur schwarz-> weiß habe, kann ich doch auch einfach z.b den AlphaKanal = Red setzen oder nicht?

MFG
Memnarch

Geändert von Memnarch (16. Jan 2011 um 04:18 Uhr)
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#10

AW: Schnelles nachladen von Bilddateien

  Alt 16. Jan 2011, 04:14
Es ist möglich, PNGs als Graustufen zu speichern, was dann quasi dem Alphakanal entspräche. Ich würde einfach alle Bilder hintereinander in einen Stream klatschen, dann kann man die bequem in einer Schleife laden (wenn ein Bild fertig geladen ist, ist der Stream direkt am Anfang des nächsten Bildes positioniert) und hat keinen Overhead.
[edit]Liste der möglichen PNG-Formate[/edit]

Geändert von Namenloser (16. Jan 2011 um 04:19 Uhr)
  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 00:30 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