Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Schnelles nachladen von Bilddateien (https://www.delphipraxis.net/157548-schnelles-nachladen-von-bilddateien.html)

Memnarch 15. Jan 2011 23:24

Schnelles nachladen von Bilddateien
 
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 :D:

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

Namenloser 15. Jan 2011 23:41

AW: Schnelles nachladen von Bilddateien
 
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]

Memnarch 15. Jan 2011 23:47

AW: Schnelles nachladen von Bilddateien
 
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

Namenloser 16. Jan 2011 00:03

AW: Schnelles nachladen von Bilddateien
 
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.

Memnarch 16. Jan 2011 00:38

AW: Schnelles nachladen von Bilddateien
 
Mh, interressante idee. Ne threadsichere liste, gibts da schon was oder muss ich da erst ran o.O(bei letzterem wirds haarig:stupid:)

Namenloser 16. Jan 2011 01:32

AW: Schnelles nachladen von Bilddateien
 
Ich würd's mal mit Delphi-Referenz durchsuchenTThreadList probieren.

Memnarch 16. Jan 2011 02:17

AW: Schnelles nachladen von Bilddateien
 
Joar..eindeutiger name, nech?^^.
Werde ich mir nach ner mütze schlaf mal angucken(und nachdem alles in einer datei verstaut werden kann :P).

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 :D), 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

Namenloser 16. Jan 2011 02:21

AW: Schnelles nachladen von Bilddateien
 
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?

Memnarch 16. Jan 2011 02:44

AW: Schnelles nachladen von Bilddateien
 
Auf den erstenblick scheint es nur 2farbig(wär ja schön, Monochrome map und transparentefarbe drüber), aber es gibt auch graustufen :P

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 :P (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 :stupid: )
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

Namenloser 16. Jan 2011 03:14

AW: Schnelles nachladen von Bilddateien
 
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]


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:49 Uhr.
Seite 1 von 3  1 23      

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