2009-07-29 6 views
7

Ich arbeite derzeit an einer App, mit der der Benutzer durch eine Reihe von lokalen Bildern (automatisch scrollen) können. Normalerweise werden fünf oder sechs gleichzeitig auf dem Bildschirm angezeigt.Beschleunigen das Laden eines Bildes von der Festplatte in einer Windows Forms (C# .net) App

Der größte Engpass im Moment scheint das tatsächliche Laden der Bilddaten von der Festplatte zu sein. Ein Timer-Thread verlangt, dass die Bilder alle 1/6 Sekunden aktualisiert werden und die App versucht, mit dieser Geschwindigkeit Schritt zu halten. Jedes Bild ist um 25Kb.

Ich habe versucht, einen rollenden Cache zu erstellen, um Bilder zu laden und zu laden, aber das wurde auch von sich selbst eingeholt, so dass es letztendlich genauso langsam wurde.

Jeder Takt der Timer, ich bin durch die sechs Bild Platzhalter Looping das nächste Bild Laden der Standard

Image img = Image.FromFile("filename"); 

Methode aber dachte, jemand von einem schnelleren Weg kennen könnten die Bilder aus Platte zu erhalten.

Es gibt zwischen 500 und 20.000 Bilder in jedem der sechs Sätze, so dass es zu groß ist, um das Ganze am Anfang in den Speicher zu laden.

Wenn jemand Vorschläge für einen schnelleren Weg hat, diese Bilder durchzuziehen, würde es sehr geschätzt werden.


Bearbeiten, um weitere Details des Anwendungsflusses hinzuzufügen.

Okay, das ist, was passiert:

User-Hits 'Play' -Taste. Der Timer-Thread beginnt mit einem Timeout von 1/6 Sekunden.

Timer Rückruf:

Update image index (_index++) 
for each viewer in list of visible viewers (the forms to display images) 
{ 
    get the filename from the id stored in the viewer 
    check to see if the file exists 
    if it does exist, 
     create new bitmap from image 
     and return that image 
    otherwise return null 

    if returned image isn't null, display it on screen 
} 

, die über ein paar Schichten offensichtlich los ist - das Bild Belastung geht in die Schichtdienste und dann geht dies bis zur Präsentation und dann auf der Benutzeroberfläche, aber das ist der Kern dessen, was geschieht, .

Antwort

8

Ich stieß auf this page, die beschreibt, wie Sie die GDI + API direkt zum Laden von Bildern verwenden. Sehr einfach zu bedienen:

ImageFast.FromFile(@"C:\MyPhoto.JPG"); 

Added zeigen Geschwindigkeit von über Imagefast Bild Aus Datei Methode

Dieses verwendet den Quellcode here gefunden.Der Code wurde kopiert und eingefügt und erforderte keine Änderungen.

Stopwatch watch = Stopwatch.StartNew(); 

string filePath = @"C:\TestImage25k.png"; 

Image fromFile = Image.FromFile(filePath); 

watch.Stop(); 

Console.WriteLine("Image.FromFile  Ticks = {0:n}", watch.ElapsedTicks); 

long fromFileTicks = watch.ElapsedTicks; 

watch.Reset(); 
watch.Start(); 

Image fastImage = ImageFast.FromFile(filePath); 

watch.Stop(); 

long fastFileTicks = watch.ElapsedTicks; 

Console.WriteLine("ImageFast.FromFile Ticks = {0:n}", watch.ElapsedTicks); 

Console.WriteLine("fromFileTicks - fastFileTicks = {0:n}", fromFileTicks - fastFileTicks); 

Die Konsolenausgabe war

 
Image.FromFile  Ticks = 19,281,605.00 

ImageFast.FromFile Ticks = 7,557,403.00 

fromFileTicks - fastFileTicks = 11,724,202.00 

Sie die Auswirkungen des Imagefast sehen können. Mit der Zeit summieren sich die 11 Millionen gespeicherten Ticks.

+1

Ich schrieb eine schnelle Test-App, um dies zu testen, und der ImageFast ist um 11 Millionen Ticks schneller. Die Aus-Datei des Bildes benötigt 19 Millionen, während die ImageFast nur 7 Millionen benötigt. –

+0

Danke für die Testergebnisse, David :) – bernhof

+0

Kein Problem. Ich mag die ImageFast-Ergebnisse. –

1

Am einfachsten ist es, einen 'next' und 'previous' Button zu setzen, um die Anzahl der Bilder und den Preload zu begrenzen.

0

Wenn Sie 6 Bilder gleichzeitig anzeigen lassen und alle 1/6 einer Sekunde ändern, sollten Leistungsprobleme auftreten. Das Laden von 150 KB von der Festplatte sollte auch ohne Zwischenspeicherung eine triviale Aktivität sein. Es klingt, als ob Sie die Dateiladungen übertreiben. Sind Sie sicher, dass Sie nur 6 Bilder gleichzeitig laden? Liest du Bilder von der Festplatte, die nicht angezeigt werden?

Wenn Sie ein wenig mehr Details des Anwendungsflusses bereitstellen können, kann ich vielleicht etwas hilfreicher sein.

+0

Hallo nützlich sein, ich habe die Frage bearbeitet ein wenig von dem App Fluss zu zeigen. Es lädt definitiv nur die 6 Bilder gleichzeitig. Wenn ich anfange, einige der "Viewer" -Fenster zu schließen, beschleunigt sich das merklich. Ich hatte auch versucht, die ersten 50 Bilder von jedem Satz in den Speicher vor dem Spielen zu lesen und das beseitigt den Flaschenhals total, so scheint es nur die Belastung zu sein, die die Dinge verlangsamt. –

0

ich würde wahrscheinlich einen Hintergrund-Thread erstellen, um kontinuierlich alle Bilder von der Festplatte zu holen (hält den ui ansprechbar) und dann veröffentlichen jedes neu geladene Bild über ein Ereignis

1

prüfen das Konzept der double buffering aus. Was Sie tun möchten, ist ein zweiter Thread, der geladen werden kann die nächste Reihe von Bildern während Sie den ersten Satz anzeigen. Sobald das 1/6-Zeitfenster erreicht ist, schalten Sie den einen Satz von Bildern aus und beginnen mit dem Laden des nächsten Satzes.

Verwandte Themen