Performanz beim Bilderzeichnen, >1000 bilder

Status
Nicht offen für weitere Antworten.
C

cmmi

Gast
Hallo,

ich lese jetzt schon seit ein paar Tagen hier mit, und habe auch schon die Tutorials durch. Die Suche hat mir auch keine brauchbaren Ergebnisse gebracht.
Also, was ist mein Problem? Ich habe eine Liste von Sequenzen, jede Sequenz ist wiederum eine Liste an Symbolen. Für jedes Symbol gibt es eine Grafikdatei.

Ich möchte nun diese Sequenzliste anzeigen, mit der Möglichkeit rein und rauszuzoomen sowie natürlich scrollen, da die liste nicht komplett auf den Bildschirm passt. Ach ja, die Bilder müssen farblich markierbar sein, da das ganze zum Anzeigen von Mustern dienen soll. Daher handelt es sich bei den Bildern um transparente pngs.

Was habe ich schon probiert: eine JList mit eigenem CellRenderer, das war aber performance technisch nicht wirklich toll, da war kein "flüssiges" betrachten und nutzen der Liste möglich.
Momentan spiele ich mit einer eigenen Component welche alles selber zeichnet. Das ist schon ganz in Ordnung, aber auch noch nicht so wahnsinnig schnelle. Habe eben mal versucht das Zeichnen einer einzelnen Sequenz in einen eigenen Thread auszulagern, aber das scheint auch nicht wirklich zu klappen.

Daher meine Frage, wie bekommt man eine solche Datenstruktur sinnvoll und vor allem flott auf den Schirm? Jemand eine Idee? Wenn nötig poste ich gerne den Code, aber vielleicht hat ja schon jemand eine generelle Idee?

Danke & greet,
Sebastian
 

Wildcard

Top Contributor
Fang bloß nicht mit Threads oder ähnlichem an. Zeig doch mal bitte den Renderer den du geschrieben hast.
Ein Umstieg von PNG auf GIF, oder das explizite verwenden eines 'compatible' Images (Bitmaskentransparenz), kann die Sache übrigens stark beschleunigen.
 
G

Guest

Gast
So, mein ListRenderer sieht so aus:

Code:
public class SequenceListCellRenderer2 implements ListCellRenderer {

	public static final int	SequenceListRowRenderer		= 1;
	public static final int	SequenceListHeaderRenderer	= 2;
	public static final boolean	STRINGVIEW	= true;
	public static final boolean	ICONVIEW		= false;
	private boolean					simpleView;
	private int	renderType;
	private Dimension	headerPanelDim;
	private Dimension	headerLabelDim;
	private Font	font;
	private final int			fontSize							= 12;
	private final int			fontStyle						= Font.PLAIN;
	private final String		fontName							= "Arial";
	private int rowHeight;
	private Hashtable<Symbol, Icon> iconCache;
	private int length = -1;
	private Dimension labelDim;

	public SequenceListCellRenderer2(int renderType, boolean simpleView) {

		assert renderType >= SequenceListRowRenderer;
		assert renderType <= SequenceListHeaderRenderer;
		this.renderType = renderType;
		this.simpleView = simpleView;
		this.iconCache = new Hashtable<Symbol, Icon>();
		if (simpleView) {
			this.rowHeight = 20;
			this.headerPanelDim = new Dimension(60,20);
			this.headerLabelDim = new Dimension(60,20);
		} else {
			this.rowHeight = 60;
			this.headerPanelDim = new Dimension(60,60);
			this.headerLabelDim = new Dimension(60,60);
		}
		this.font = new Font(this.fontName, this.fontStyle, this.fontSize);
	}

	public Component getListCellRendererComponent(JList list, Object value,
			int index, boolean isSelected, boolean cellHasFocus) {

		switch (this.renderType) {
			case SequenceListRowRenderer:
				return this.getListRowRendererComponent(list, value, index,
						isSelected, cellHasFocus);
			case SequenceListHeaderRenderer:
				return this.getListHeaderRendererComponent(list, value, index,
						isSelected, cellHasFocus);
			default:
				return null;
		}

	}

	private Component getListHeaderRendererComponent(JList list, Object value,
			int index, boolean isSelected, boolean cellHasFocus) {

		Sequence sequence = (Sequence) value;

		JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 2));
		panel.setMinimumSize(this.headerPanelDim);
		panel.setPreferredSize(this.headerPanelDim);
		panel.setMaximumSize(this.headerPanelDim);

		JLabel header = new JLabel(sequence.getIdentifier());
		int sizeNeeded = sequence.getIdentifier().length() * 12;
		if (sizeNeeded > this.headerLabelDim.getWidth()
				|| sizeNeeded > this.headerPanelDim.getWidth()) {
			this.headerLabelDim.setSize(sizeNeeded, this.headerLabelDim
					.getHeight());
			this.headerPanelDim.setSize(sizeNeeded, this.headerPanelDim
					.getHeight());
		}
		header.setMinimumSize(this.headerLabelDim);
		header.setPreferredSize(this.headerLabelDim);
		header.setMaximumSize(this.headerLabelDim);
		header.setFont(this.font);

		panel.add(header);
		return panel;
	}

	private Component getListRowRendererComponent(JList list, Object value,
			int index, boolean isSelected, boolean cellHasFocus) {

		Sequence sequence = (Sequence) value;
		SequenceMarker marker;

		JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 2));
		
		if (this.length == -1 || this.labelDim == null) {
			if (this.simpleView) {
				length = sequence.getLength() * 20;
				labelDim = new Dimension(20, this.rowHeight - 4);
			} else {
				length = sequence.getLength() * (sequence.getSymbol(0).getIcon().getIconWidth());
				labelDim = new Dimension(sequence.getSymbol(0).getIcon().getIconWidth(), this.rowHeight - 4);
			}
		}
		
		JLabel symbol;
		Symbol sym;
		Icon icon;
		for (int i = 0; i < sequence.getLength(); i++) {
			symbol = new JLabel();
			if (this.simpleView) {
				symbol.setText(sequence.getSymbol(i).getIdentifier());
				symbol.setFont(this.font);
			} else {
				//symbol.setIcon(sequence.getSymbol(i).getIcon());
				sym = sequence.getSymbol(i);
				icon = this.iconCache.get(sym);
				if (icon == null) {
					icon = sym.getIcon();
					this.iconCache.put(sym, icon);
				}
				symbol.setIcon(icon);
			}
			symbol.setMinimumSize(labelDim);
			symbol.setPreferredSize(labelDim);
			symbol.setMaximumSize(labelDim);
			symbol.setHorizontalAlignment(SwingConstants.CENTER);
			marker = sequence.getMarkerAtPosition(i);
		
			if (marker != null) {
				symbol.setBackground(marker.getPattern().getColor());
				symbol.setBorder(BorderFactory.createLineBorder(marker.getPattern().getColor(), 2));
			} else {
				symbol.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
			}
			symbol.setOpaque(true);
			panel.add(symbol);
		}

		panel.setMinimumSize(new Dimension(length, this.rowHeight));
		panel.setPreferredSize(new Dimension(length, this.rowHeight));
		panel.setMaximumSize(new Dimension(length, this.rowHeight));

		return panel;
	}
[/code][/quote]
 

Wildcard

Top Contributor
Ein Renderer legt keine neuen Components an! Erstell dir genau die 2-3 Labels die du brauchst, und setz deren Text/Icon entsprechend immer wieder neu.
Die JComponents werden nur zum Zeichnen verwendet, können als problemlos mehrfach verwendet werden.
 
C

cmmi

Gast
Wildcard hat gesagt.:
Ein Renderer legt keine neuen Components an! Erstell dir genau die 2-3 Labels die du brauchst, und setz deren Text/Icon entsprechend immer wieder neu.
Die JComponents werden nur zum Zeichnen verwendet, können als problemlos mehrfach verwendet werden.

Danke, da hast Du wohl recht, aber es wird trotzdem nicht wirklich schneller. Habe gerade alles soweit entfernt.

Es sind eben immer noch über 4000 Bilder, welche er da rendert, auch wenn es nur ca 20 verschiedene sind. Gibt es doch noch irgendetwas um das zu beschleunigen?
 

Wildcard

Top Contributor
Im Prinzip dürften ja nur wenige Icons gleichzeitig zu sehen sein und nur die müssen gerendert werden.
Wie gesagt, compatible images sind wesentlich schneller als Bilder mit komplettem Alphakanal. Versuch mal das, oder pack den Profiler aus um zu sehen ob du wirklich die Zeit beim Rendern der Bilder verlierst.
 
C

cmmi

Gast
Wildcard hat gesagt.:
Im Prinzip dürften ja nur wenige Icons gleichzeitig zu sehen sein und nur die müssen gerendert werden.
Wie gesagt, compatible images sind wesentlich schneller als Bilder mit komplettem Alphakanal. Versuch mal das, oder pack den Profiler aus um zu sehen ob du wirklich die Zeit beim Rendern der Bilder verlierst.

@Wildcard Danke für den Tipp mit den compatible images, damit funktioniert es jetzt ohne Probleme. Zumindest mit meiner selbsgestrickten Component. Aber die gefällt mir optisch eh besser als die Liste.
Auch Zoomen funktioniert ohne zeitliche Verzögerungen, genial.

Danke nochmal. =)

Hier noch der Code den ich zum laden der Bilder verwende, falls es jemanden interessiert:
Code:
public class LoadImagesThread extends Thread {

	private HashMap<Symbol, BufferedImage> cache;
	private Symbol	symbol;
	
	public LoadImagesThread(ExtendedThreadGroup threads, HashMap<Symbol, BufferedImage> images, Symbol symbol) {
		super(threads, "loading image from " + symbol);
		this.cache = images;
		this.symbol = symbol;
	}
	
	public void run() {
		try {
			/**
			 * Idea from:
			 * @see [url]http://www.curious-creature.org/2005/10/04/drag-and-drop-effects-part-1-swing-demo/[/url]
			 */
			BufferedImage source = ImageIO.read(new File(this.symbol.getImagePath()));
			GraphicsConfiguration config = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration();
			BufferedImage converted = config.createCompatibleImage(source.getWidth(), source.getHeight(), source.getTransparency());
			Graphics g = converted.createGraphics();
			g.drawImage(source, 0, 0, null);
			g.dispose();
			this.cache.put(this.symbol, converted);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B im JFrame gesetzte Hintergrundfarbe wird beim Ausführen nicht gezeigt AWT, Swing, JavaFX & SWT 2
Juelin Problem beim Laden Controller AWT, Swing, JavaFX & SWT 2
O Swing Icon verschwindet beim Verschieben eines JLabels AWT, Swing, JavaFX & SWT 8
MartinNeuerlich Kann mir jemand, der einen Mac mit einem m1 oder m2-Chip hat, eine POM geben mit der Javafx-Fullscreen beim Mac mit m-Chip funktioniert? AWT, Swing, JavaFX & SWT 1
berserkerdq2 Wie greife ich auf ein Element zu, welches ich beim Scenebuilder erstellt habe AWT, Swing, JavaFX & SWT 10
H AWT Dialog Größe ändern - Schwarzer Inhalt beim groß ziehen AWT, Swing, JavaFX & SWT 1
L jComboBox Actionlistener wird beim erstmaligen Befüllen getriggert AWT, Swing, JavaFX & SWT 7
B Output GUI funktioniert nur beim ersten Mal richtig. AWT, Swing, JavaFX & SWT 4
A JavaFX exportierte Jar ohne beim starten die Libs hinzufügen? AWT, Swing, JavaFX & SWT 2
TheWhiteShadow JavaFX ListView Problem beim Entfernen von Elementen AWT, Swing, JavaFX & SWT 1
S Fehler beim Öffnen weiterer FXML AWT, Swing, JavaFX & SWT 11
I Probleme beim Drucken auf einen PDF-Drucker AWT, Swing, JavaFX & SWT 8
G Gui updated beim zweiten Aufruf nicht mehr AWT, Swing, JavaFX & SWT 15
K JavaFX Resizing-Problem beim BorderLayout (Center Component) beim Arbeiten mit mehreren FXMLs AWT, Swing, JavaFX & SWT 2
W Nullpointer Exception beim übertragen von Daten von Scene zu Scene AWT, Swing, JavaFX & SWT 6
missy72 JavaFX Wiederholen einer IF-Abfrage beim erneuten Öffnen einer Stage AWT, Swing, JavaFX & SWT 11
D JavaFX Probleme beim nachtäglichen hinzufügen der jfx dependency AWT, Swing, JavaFX & SWT 7
R NullPointerException beim Start des Fensters AWT, Swing, JavaFX & SWT 1
D JavaFX Label flackert beim aktualisieren AWT, Swing, JavaFX & SWT 12
J Kann mir jemand beim MediaPlayer helfen ? AWT, Swing, JavaFX & SWT 2
S JavaFx Zufallsfarbe beim Button-Klick AWT, Swing, JavaFX & SWT 22
L Swing JDialog ton beim klicken ausstellen AWT, Swing, JavaFX & SWT 1
sascha-sphw JavaFX ListCell höhe verändert sich beim ändern der Text-Farbe AWT, Swing, JavaFX & SWT 14
H Beim JFrame erstellen ein anderes schließen AWT, Swing, JavaFX & SWT 0
L Swing JLabel wird beim ändern der Schriftart immer neu gezeichnet. AWT, Swing, JavaFX & SWT 2
M AWT Kann meinen Fehler beim ActionListener nicht finden AWT, Swing, JavaFX & SWT 5
R 2D-Grafik Massive Frame Drops beim Benutzen von AffineTransformOp AWT, Swing, JavaFX & SWT 2
ruutaiokwu Swing windowStateChanged macht exakt das Gegenteil beim Verändern der Fenstergrösse AWT, Swing, JavaFX & SWT 3
J Exception beim JFrame erstellen AWT, Swing, JavaFX & SWT 6
B 2D-Grafik paintcomponent Probleme beim zeichnen AWT, Swing, JavaFX & SWT 10
D JInternalFrame wechselt Position beim ersten Click AWT, Swing, JavaFX & SWT 0
steven789hjk543 Swing Verstehe etwas beim GUI nicht AWT, Swing, JavaFX & SWT 3
L JavaFX Probleme beim Installieren JavaFX11 / JavaFX12 -- Eclipse 2019-03 AWT, Swing, JavaFX & SWT 3
H JavaFX Probleme Beim Wechseln der scene als .fxml AWT, Swing, JavaFX & SWT 7
A Fehler beim Hintergrund AWT, Swing, JavaFX & SWT 17
F JavaFX Probleme beim automatischen Konvertieren AWT, Swing, JavaFX & SWT 4
J Hilfe beim tablevies AWT, Swing, JavaFX & SWT 2
L JavaFX Fehler beim setzen von Farben AWT, Swing, JavaFX & SWT 16
T LookAndFeel LookAndFeel funktioniert nicht beim JFrame wechsel AWT, Swing, JavaFX & SWT 3
L Java FX Exception beim start AWT, Swing, JavaFX & SWT 2
L JSplitPane Divider Location beim Maximieren AWT, Swing, JavaFX & SWT 6
L JavaFX Problem beim Aufrufen einer Methode AWT, Swing, JavaFX & SWT 5
J ObservableList wirft exception beim zweiten füllen. AWT, Swing, JavaFX & SWT 4
emma_louisa JavaFX Werte beim Aufrufen des Fensters übernehmen (SceneBuilder) AWT, Swing, JavaFX & SWT 3
Tronert JavaFX Fehler beim Ändern der font-weight AWT, Swing, JavaFX & SWT 7
G Swing Hilfe beim Einbinden von Bildern in einem JFrame AWT, Swing, JavaFX & SWT 8
D Kein Icon beim JTabbedPane AWT, Swing, JavaFX & SWT 1
L JavaFX LoadException beim Laden von JavaFX Anwendung AWT, Swing, JavaFX & SWT 6
T Java FX Probleme beim befüllen eines Tableviews AWT, Swing, JavaFX & SWT 5
N Eclipse - GUI - MacBook - Buttonsichtbarkeit beim Anlegen/Erstellen AWT, Swing, JavaFX & SWT 14
S AWT Probleme beim Zeichnen AWT, Swing, JavaFX & SWT 3
T JButton wird beim vergrößern des Fensters erst sichtbar AWT, Swing, JavaFX & SWT 4
Tommy135 JavaFX JavaFX Fehler beim Scenewechsel AWT, Swing, JavaFX & SWT 23
E Swing Miserable Performance beim Ändern der Hintergrundfarbe von JLabels AWT, Swing, JavaFX & SWT 3
L Charset beim Drucken falsch AWT, Swing, JavaFX & SWT 2
MaxG. Swing Farbe von Button beim drücken ändern AWT, Swing, JavaFX & SWT 4
H JavaFX Kriege fehler beim Fenster wechseln AWT, Swing, JavaFX & SWT 7
D Swing Swing Objekte sehen im Entwurf anders aus als beim Ausführen AWT, Swing, JavaFX & SWT 3
R Swing Programm läuft nur beim Debuggen korrekt ab AWT, Swing, JavaFX & SWT 4
I 2D-Grafik Problem beim Ändern der Farbe eine 2d Objekts AWT, Swing, JavaFX & SWT 3
K Probleme beim JPasswordField AWT, Swing, JavaFX & SWT 11
W Kodierung (CharSet) beim Schreiben ändern AWT, Swing, JavaFX & SWT 1
D Swing JComboBox (DefaultComboBoxModel) überschreibt Eintrag beim erstellen AWT, Swing, JavaFX & SWT 0
T JButton überlagern sich und werden erst beim Mausscrollen sichtbar AWT, Swing, JavaFX & SWT 2
Thallius Swing "..." beim JLabel verhindern? AWT, Swing, JavaFX & SWT 3
P Scrollbalken verschwinden beim Zoomen AWT, Swing, JavaFX & SWT 4
A JavaFX DatePicker in Swing beim Start nicht sichtbar AWT, Swing, JavaFX & SWT 2
D JavaFX Probleme bei Service-Klasse beim ändern der GUI AWT, Swing, JavaFX & SWT 8
D JavaFX (WebStart) Graues Fenster beim Start AWT, Swing, JavaFX & SWT 4
K Probleme beim zeichnen mit paintComponent() AWT, Swing, JavaFX & SWT 1
O Swing JList beim Klicken in der GUI erstellen AWT, Swing, JavaFX & SWT 6
D Frame beim starten eines anderen Frames schließen AWT, Swing, JavaFX & SWT 2
R Hilfe beim ändern des Hintergrundes eines JFrames AWT, Swing, JavaFX & SWT 9
7 JavaFX Problem beim Zeichnen eines Dreiecks in einem GUI AWT, Swing, JavaFX & SWT 6
L JavaFX Verzögerung beim Laden von Daten AWT, Swing, JavaFX & SWT 6
S NullPointer Exception beim Laden von Bildern AWT, Swing, JavaFX & SWT 11
I JavaFX Speichern der eingefügten Einträge beim Neustart des Programms AWT, Swing, JavaFX & SWT 2
J JavaFx/SceneBuilder/Felder beim verlassen prüfen AWT, Swing, JavaFX & SWT 1
D JavaFX Beim Schließen (Rotes X) Code ausführen AWT, Swing, JavaFX & SWT 1
N Swing Problem beim Scrollen mit JScrollPane AWT, Swing, JavaFX & SWT 6
C Gesucht: Hilfe beim programmieren. AWT, Swing, JavaFX & SWT 1
S Action durchführen beim Programm beenden AWT, Swing, JavaFX & SWT 3
J JavaFX Tooltip Verzögerung beim ersten Anzeigen AWT, Swing, JavaFX & SWT 4
C Hilfe beim programmieren mit studiumgebundenes Projekt AWT, Swing, JavaFX & SWT 1
A JavaFX Hilfe beim Design eines Quiz AWT, Swing, JavaFX & SWT 2
H JavaFX Freezes beim Zeichnen mit Canvas AWT, Swing, JavaFX & SWT 3
D JavaFX build.fxbuild error beim Erstellen einer exe AWT, Swing, JavaFX & SWT 2
C Java FX Probleme beim Schließen einer Stage AWT, Swing, JavaFX & SWT 11
M Swing Vorgehen beim Aufruf der Klassen/Methoden AWT, Swing, JavaFX & SWT 7
T Swing NullPointerException beim auslesen von jTextField - Anfänger! AWT, Swing, JavaFX & SWT 3
R Swing Elemente verschieben sich im GBL beim Ein/Ausblenden AWT, Swing, JavaFX & SWT 0
N Swing JTree Problem beim erstellen der Knoten AWT, Swing, JavaFX & SWT 0
F Breite beim GridBagLayout festlegen AWT, Swing, JavaFX & SWT 2
N Swing CardLayout: Problem beim Wechsel zwischen den JPanels AWT, Swing, JavaFX & SWT 3
R TriangleMesh verschwindet teilweise beim resizen des Frames, sowie beim rotieren? AWT, Swing, JavaFX & SWT 1
S Swing Warum funktioniert der automatische Zeilenumbruch mit arabischen Zeichen beim JTextPane nicht AWT, Swing, JavaFX & SWT 3
T Problem beim Zeichnen von Rechteck AWT, Swing, JavaFX & SWT 3
H Swing Probleme beim erstellen eines neuen Objektes durch einen Button AWT, Swing, JavaFX & SWT 10
S Größe der Komponenten, beim ändern der größe des Frames, mit ändern! AWT, Swing, JavaFX & SWT 2
K Swing Automatisches "Packen" beim "Neu-Painten" AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben