T
tuxedo
Gast
Hallo,
ich habe folgende Problem:
Ich bastle an einem Programm das mit GPS Wegpunkte aufzeichnet, in eine DB speichert und auch wieder im Programm anzeigt. Anfangs ging das noch ziemlich gut und auch schnell. Doch mittlerweile wachsen die Daten und ich stoße an die Grenzen meines Wissens.
In einem JPanel hab ich die paintMethode überschrieben und zeichne mit g.drawLine() meine aufgezeichneten Wege.
Das sieht z.B. so aus (hab mal nur die Karte aus dem Programm ausgeschnitten):
Aktuell sind auf dem Bild über 3000 Wegpunkte zu sehen die mit einer Linie verbunden sind. Insgesamt zeigt das Bild eine ungefähre entfernung von 20km von unten links nach oben rechts an. D.h. wenn ich in der Ortschaft unten links oder oben rechts noch mehr Daten gesammelt hätte würde er noch mehr zeichnen, auch wenn man die einzelnen Straßen wohlmöglich nur schwer erkennen könnte. Eigtl ist das sehr ineffizient. Aber siehe weiter unten bei meiner abschließenden Frage....
Meine paintMethode mach im Prinzip nur das hier:
+ Nimm den Vector in dem alle miteinander assoziierten Pixel sind und arbeite diesen Element für Element ab:
+ Wenn das mit g.drawLine zu zeichnenden Pixel-Paar im Ausschnitt der Karte liegt, zeichne dies.
Ich hab hier bewusst mal den Quellcode weggelassen da ich hier alles aufs allernötigste reduziert hab um möglichst jedes instanziieren einer Hilfsvariable zu vermeiden, um Zeit zu sparen. Sieht also mehr oder weniger ganz wild aus.
Der Vector enthät nix weiter wie eigene Pixel-Objekte in denen steht welche 2 Pixel miteinander verbunden werden müssen.
Der Vector wird in einer Endlosschleife immer wieder mit der DB angeglichen und enthält mehr Daten als aktuell gezeichnet werden müssen. Das dient dazu nicht bei jedem Zeichenvorgang eine Anfrage an die DB stellen zu müssen.
Die endlosschleife schiebt bei jedem durchlauf den Vector mit den Daten an das JPanel das die karte darstellt. Nach dem weitergeben der Daten erfolgt ein "globaler" repaint(). Erst dachte ich dass das erneute zeichnen des ganzen programmfensters so viel leistung frisst und hab mal testweise mit meine Karte neu zeichnen lassen (mapPanel.repaint()), aber das brachte keinen sichbaren Erfolg.
Dann habe ich Stück für Stück Programmteile abgeschaltet um zu sehen an welchem Teil die meisten Ressourcen drauf gehen. Und tatsächlich: Es liegt an der paintMethode die einfach viel zu viel zeichnen muss.
Ich muss dazu sagen: Die Endlosschleife hat am Ende ein sleep(1) um die CPU nicht vollends zu vereinnahmen.
Getriggert wird die Endlosschleife allerdings durch den simulierten Empfang der GPS Daten. D.h. im Moment kommen alle 10ms neue GPS-Daten rein so dass, grob gesagt, alle 10ms ein repaint() erfolgen muss um die Karte auf dem laufenden zu halten.
Für den realfall der Anwendung mag das noch schnell sein. Aber im realfal hat man auch schnell mehr zu zeichnen weil einfach mehr Daten vorhanden sind.
Ok, kommen wir zur eigentlichen Frage:
Bietet Java oder irgendeine 2D API etwas schnelleres als g.drawLine()?
Oder gibt es einen Algorithmus der mir da weiterhelfen könnte (siehe Problem weiter oben mit dem zu viel zeichnen das man eh nicht erkennen kann)?
gruß
Alex
P.S. Sorry wenn ich das falsche Sub-Board erwischt hab. Alle anderen schienen mir nicht zu passen.
ich habe folgende Problem:
Ich bastle an einem Programm das mit GPS Wegpunkte aufzeichnet, in eine DB speichert und auch wieder im Programm anzeigt. Anfangs ging das noch ziemlich gut und auch schnell. Doch mittlerweile wachsen die Daten und ich stoße an die Grenzen meines Wissens.
In einem JPanel hab ich die paintMethode überschrieben und zeichne mit g.drawLine() meine aufgezeichneten Wege.
Das sieht z.B. so aus (hab mal nur die Karte aus dem Programm ausgeschnitten):

Aktuell sind auf dem Bild über 3000 Wegpunkte zu sehen die mit einer Linie verbunden sind. Insgesamt zeigt das Bild eine ungefähre entfernung von 20km von unten links nach oben rechts an. D.h. wenn ich in der Ortschaft unten links oder oben rechts noch mehr Daten gesammelt hätte würde er noch mehr zeichnen, auch wenn man die einzelnen Straßen wohlmöglich nur schwer erkennen könnte. Eigtl ist das sehr ineffizient. Aber siehe weiter unten bei meiner abschließenden Frage....
Meine paintMethode mach im Prinzip nur das hier:
+ Nimm den Vector in dem alle miteinander assoziierten Pixel sind und arbeite diesen Element für Element ab:
+ Wenn das mit g.drawLine zu zeichnenden Pixel-Paar im Ausschnitt der Karte liegt, zeichne dies.
Ich hab hier bewusst mal den Quellcode weggelassen da ich hier alles aufs allernötigste reduziert hab um möglichst jedes instanziieren einer Hilfsvariable zu vermeiden, um Zeit zu sparen. Sieht also mehr oder weniger ganz wild aus.
Der Vector enthät nix weiter wie eigene Pixel-Objekte in denen steht welche 2 Pixel miteinander verbunden werden müssen.
Der Vector wird in einer Endlosschleife immer wieder mit der DB angeglichen und enthält mehr Daten als aktuell gezeichnet werden müssen. Das dient dazu nicht bei jedem Zeichenvorgang eine Anfrage an die DB stellen zu müssen.
Die endlosschleife schiebt bei jedem durchlauf den Vector mit den Daten an das JPanel das die karte darstellt. Nach dem weitergeben der Daten erfolgt ein "globaler" repaint(). Erst dachte ich dass das erneute zeichnen des ganzen programmfensters so viel leistung frisst und hab mal testweise mit meine Karte neu zeichnen lassen (mapPanel.repaint()), aber das brachte keinen sichbaren Erfolg.
Dann habe ich Stück für Stück Programmteile abgeschaltet um zu sehen an welchem Teil die meisten Ressourcen drauf gehen. Und tatsächlich: Es liegt an der paintMethode die einfach viel zu viel zeichnen muss.
Ich muss dazu sagen: Die Endlosschleife hat am Ende ein sleep(1) um die CPU nicht vollends zu vereinnahmen.
Getriggert wird die Endlosschleife allerdings durch den simulierten Empfang der GPS Daten. D.h. im Moment kommen alle 10ms neue GPS-Daten rein so dass, grob gesagt, alle 10ms ein repaint() erfolgen muss um die Karte auf dem laufenden zu halten.
Für den realfall der Anwendung mag das noch schnell sein. Aber im realfal hat man auch schnell mehr zu zeichnen weil einfach mehr Daten vorhanden sind.
Ok, kommen wir zur eigentlichen Frage:
Bietet Java oder irgendeine 2D API etwas schnelleres als g.drawLine()?
Oder gibt es einen Algorithmus der mir da weiterhelfen könnte (siehe Problem weiter oben mit dem zu viel zeichnen das man eh nicht erkennen kann)?
gruß
Alex
P.S. Sorry wenn ich das falsche Sub-Board erwischt hab. Alle anderen schienen mir nicht zu passen.