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 15. Jan 2011 · letzter Beitrag vom 23. Mai 2023
Antwort Antwort
Benutzerbild von Memnarch
Memnarch

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

Schnelles nachladen von Bilddateien

  Alt 15. Jan 2011, 23: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 15. Jan 2011, 23: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 15. Jan 2011, 23: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, 00: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 00: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, 00: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, 01:32
Ich würd's mal mit Delphi-Referenz durchsuchenTThreadList probieren.
  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 23: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