SWT statt swing? vllt was anderes? vllt gehts garnicht?
-
Schönen guten Morgen, wenn man das noch sagen darf!
Also ich sitz jetzt schon ein bischen dran, und versuche meinen Plot schneller zu kriegen.
Und zwar lese ich das Straßennetz von San Francisco ein. Und möchte es dann in meinem Programm wieder darstellen.http://www.cs.fsu.edu/~lifeifei/research/tpq/SF.cnode
http://www.cs.fsu.edu/~lifeifei/research/tpq/SF.cedgeSo weit so gut. Klappt auch alles. Das problem ist, das netz ist in einer Auflösung von 10.000 x 10.000
Also habe ich das JPanel auf dem ich Plotte in ein JScrollPane gemacht. Wenn ich jetzt in diesem Scrollen möchte hakt es aber extrem.
Jetzt hab ich mich heute morgen etwas belesen, und herausgefunden das SWT um einiges schneller sein soll als Swing/AWT.
Könnte ich das damit hinbekommen? Gibt es vllt eine möglichkeit bei swing zu bleiben und trotzdem schnell zu sein?
Denn mir fehlt die möglichkeit das für einen Mac zu testen, welchen mein Prof nutzt.Kriege ich das überaupt schneller? Oder muss ich dafür mein Programm ändern?
Wie sähe das in C aus? Habe damals mal versucht eine GUI mit der WinAPI zu schreiben.
Und das fand ich eine Katastrophe. Also wäre das da überhaupt schneller?Vllt liegt es ja auch an meinem Rechner
Wenn jemand Zeit hat kann er ja mal testen ob es bei ihm schnell geht?!
package Main; import gui.*; public class Navi { public static void main(String args[]) { new Gui(); } }
package gui; import java.awt.Color; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import util.*; public class Gui { private Daten data = new Daten(); public Gui() { this.data.loadDaten2("SF.cedge"); this.data.loadDaten("SF.cnode"); PrintMap p = new PrintMap(); p.setValue(this.data); JPanel jp = new JPanel(); jp.add(p); JFrame contentFrame = new JFrame("Navi"); contentFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); contentFrame.getContentPane().setBackground(Color.WHITE); contentFrame.add(new JScrollPane(jp)); contentFrame.setVisible(true); contentFrame.setExtendedState(JFrame.MAXIMIZED_BOTH); } }
package util; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; public class Daten { public double nodes[][] = new double[200000][3]; public double edges[][] = new double[250000][4]; public int nodeLines = 0; public int edgeLines = 0; public void loadDaten(String FileName) { try { FileReader fr; fr = new FileReader(FileName); BufferedReader br = new BufferedReader(fr); String zeile = ""; while ((zeile = br.readLine()) != null) { String a[] = zeile.split(" "); this.nodes[this.nodeLines][0] = Double.valueOf(a[0]); this.nodes[this.nodeLines][1] = Double.valueOf(a[1]); this.nodes[this.nodeLines][2] = Double.valueOf(a[2]); this.nodeLines++; } br.close(); } catch (FileNotFoundException e) { } catch (IOException e) {} } public void loadDaten2(String FileName) { try { FileReader fr; fr = new FileReader(FileName); BufferedReader br = new BufferedReader(fr); String zeile = ""; while ((zeile = br.readLine()) != null) { String a[] = zeile.split(" "); this.edges[this.edgeLines][0] = Double.valueOf(a[0]); this.edges[this.edgeLines][1] = Double.valueOf(a[1]); this.edges[this.edgeLines][2] = Double.valueOf(a[2]); this.edges[this.edgeLines][3] = Double.valueOf(a[3]); this.edgeLines++; } br.close(); } catch (FileNotFoundException e) { } catch (IOException e) {} } }
package gui; import java.awt.Dimension; import java.awt.Graphics; import javax.swing.JPanel; import util.*; public class PrintMap extends JPanel { Daten d = new Daten(); public void setValue(Daten dd) { this.setPreferredSize(new Dimension(2000, 2100)); this.d = dd; } public void paintComponent(Graphics g) { super.paintComponent( g ); g.drawLine(1920, 0, 1920, 10000); g.drawLine(0, 2770, 10000, 2770); for(int i=1; i<this.d.nodeLines; i++) { g.fillOval((int)(this.d.nodes[i][1]/10)-2, 2000-(int)(this.d.nodes[i][2]/10)-2, 4, 4); } for(int i=1; i<this.d.edgeLines; i++) { int x1 = (int)this.d.nodes[((int)this.d.edges[i][1])][1]; int y1 = (int)this.d.nodes[((int)this.d.edges[i][1])][2]; int x2 = (int)this.d.nodes[((int)this.d.edges[i][2])][1]; int y2 = (int)this.d.nodes[((int)this.d.edges[i][2])][2]; g.drawLine(x1/10, 2000-y1/10, x2/10, 2000-y2/10); } this.revalidate(); } }
-
Du zeichnest bei jeden paint Aufruf 250.000 Linien und 200.000 Kreise, kein Wunder dass das rumlahmt. Wie wär's erstmal daran was zu ändern bevor du über einen Umstieg nachdenkst. Wenn du das in SWT oder C genauso machen würdest wär's genauso langsam
-
ok... hab versucht das jetzt als image zu machen. Allerdings kriege ich ne OutOfMemoryError wenn ich versuche ein Bild mit 10.000x10.000px zu erzeugen...
gibt es vllt einen anderen weg?
-
Du bist ja immer auf einem bestimmten Zoom-Level im Bild. Es wäre also naheliegend nur diesen zu zeichnen.
Mir dämmert du hast viel zu wenig Erfahrung um dein Projekt jemals halbwegs hinzubekommen
MfG SideWinder
-
Lachhaft... bloß eine herausforderung...
Bisher habe ich noch alles geschafft.
Das Problem ist eigentlich nur, das ich gern alles auf einmal hätte.
Und wenn das nicht geht, muss ich es halt anders machen.Problematisch ist allerdings in der tat, dass mir ein paar vorraussetzungen fehlen.
kenntinsse in DND wären ganz nett dafür...
Aber auch das kriege ich schon iwie zurecht gepfuscht.Aber ich gebe dir Brif und Siegel, das ich bis spätestens 10 Januar ein Programm fertig habe, das mir eine Route zwischen zwei punkten berechnet, mir distanz zeigt, mir einen regresseionsplott zeichnet für eine durchschnittliche pfadsuche nach Tiefensuche, Breitensuche, Dijkstra und A*. Auch wird es mir möglich sein mich mit Zoom auf der Karte zu bewegen, routen zu markieren, und fest zu halten welche pfadsuche nicht die richtige war.