Image laden sehr langsam

Ranjo

Mitglied
Mein Problem ist , dass folgender Code zum laden und Anzeigen der Bilder sehr lange bei der Ausführung dauert.
Ca 300 Bilder in der DB bei einer größe von 20-100kb pro Bild.
Das laden dauert knapp 10 sek.
Kann man das irgendwie beschelunigen?

Gruß
Spaceman

Java:
            File file = new File("img_fm/"+model.getFilmData().elementAt(i).getName()+".jpg");
            ImageIcon icon;
            if(file.exists())
            {
                 icon = new ImageIcon("img_fm/"+model.getFilmData().elementAt(i).getName()+".jpg");
            }
            else
            {
                icon = new ImageIcon("sources/no_pic.gif");
            }
            
            icon.setImage(icon.getImage().getScaledInstance(100, 150, 0));
            btns.elementAt(i).setIcon(icon);
 
Ich bin zwar noch relativ neu in der Programmierung und habe keine Erfahrung, aber mein logischer Menschenverstand sagt mir, x Zugriffe auf die Platte dauern auch x * Zugriffszeit * (Datengröße*FaktorJeKB)

Sprich wenn du 300 Pics lädst und die Zugriffszeit je Pic schon 15ms dauert, dann sind alleine das schon 4,5 Sekunden.


Grüße
 
Java:
            File file = new File("img_fm/"+model.getFilmData().elementAt(i).getName()+".jpg");
            ImageIcon icon;
            if(file.exists())
            {
                 icon = new ImageIcon("img_fm/"+model.getFilmData().elementAt(i).getName()+".jpg");
            }
            else
            {
                icon = new ImageIcon("sources/no_pic.gif");
            }
            
            icon.setImage(icon.getImage().getScaledInstance(100, 150, 0));
            btns.elementAt(i).setIcon(icon);


Die Frage ist ob dein else Zweig viel Sinn macht, jedes mal dafür ein neues Image zu laden. Allgemein ist bei Bilder bzw. allg. Resourcen immer ein Caching oder eine Registry sinnvoll, damit Bilder nicht mehrfach erstellt werden

300 Bilder skalieren dauert eben dann seine Zeit. Die Frage ist zeigst du alles gleichzeitig an? Ansonsten kannst du das skalieren in einen Background Job auslagern.
 
Hey, erstmal danke für die Antworten.

Wenn ich das skalieren weglasse ist es zeitlich kaum fühlbar.
Das mit dem Else-Block werde ich mal ausprobieren.
Die 300 Bilder werden dann in einem Scrollpanel angezeigt und auf dem ersten Blick sind halt nur die ersten 10 oder 20 Bilder zu sehen, wie kann ich das auslagern? Ich denke du willst auf Threads hinaus?
 
Hey, erstmal danke für die Antworten.

Wenn ich das skalieren weglasse ist es zeitlich kaum fühlbar.
Das mit dem Else-Block werde ich mal ausprobieren.
Die 300 Bilder werden dann in einem Scrollpanel angezeigt und auf dem ersten Blick sind halt nur die ersten 10 oder 20 Bilder zu sehen, wie kann ich das auslagern? Ich denke du willst auf Threads hinaus?

Gibt mehrere Möglichkeiten je nachdem schwerer umzusetzen.
1) SwingWorker verwenden und einen Ladebalken während des Laden anzeigen
2) SwingWorker verwenden und nur die geladenen Bilder dann nach und nach anzeigen und solange ein bild nicht geladen ist ein warten bild anzeigen. Sobald es dann fertig geladen ist sieht es der User sofort.
3)Die ersten 20 Bilder laden und beim scorllen die nächsten 20 Bilder laden usw. --> schwiergiste Variante, da Swing nichts für lazy loading parat hat.

EDIT: Wie gesagt Caching wäre evt. auch sinnvoll, dann dauert das 1. Laden "lang", aber die nachfolgenden Anzeigen eventuell nicht mehr.
 
Zuletzt bearbeitet von einem Moderator:
Gibt mehrere Möglichkeiten je nachdem schwerer umzusetzen.
1) SwingWorker verwenden und einen Ladebalken während des Laden anzeigen
2) SwingWorker verwenden und nur die geladenen Bilder dann nach und nach anzeigen und solange ein bild nicht geladen ist ein warten bild anzeigen. Sobald es dann fertig geladen ist sieht es der User sofort.
3)Die ersten 20 Bilder laden und beim scorllen die nächsten 20 Bilder laden usw. --> schwiergiste Variante, da Swing nichts für lazy loading parat hat.

Einen Ladebalken habe ich bereits implementiert, die Klasse SwingWorkerist mr bishe rnicht bekannt.
Danke für den Tipp, werde mich mal damit versuchen und mich dann melden!
 
Gibt mehrere Möglichkeiten je nachdem schwerer umzusetzen.
1) SwingWorker verwenden und einen Ladebalken während des Laden anzeigen
2) SwingWorker verwenden und nur die geladenen Bilder dann nach und nach anzeigen und solange ein bild nicht geladen ist ein warten bild anzeigen. Sobald es dann fertig geladen ist sieht es der User sofort.
3)Die ersten 20 Bilder laden und beim scorllen die nächsten 20 Bilder laden usw. --> schwiergiste Variante, da Swing nichts für lazy loading parat hat.

EDIT: Wie gesagt Caching wäre evt. auch sinnvoll, dann dauert das 1. Laden "lang", aber die nachfolgenden Anzeigen eventuell nicht mehr.

Super, mit SwingWorker klappt es wunderbar!

Danke Dir!
 

Neue Themen


Zurück
Oben