# Tacho-Instrumente



## sutcha (20. Sep 2007)

Hallo liebe Coder 

ich möchte einen "Tacho" erstellen, der in gewisse Intervalle unterteilt ist (farbliche Unterteilung: zB 0-50 grün, 50-80 gelb, 80-120 rot). Die Nadel zeigt den aktuellen Wert an und unter dem Tacho, oder zumindest unter der Nadel, steht der Wert dann nochmal. Momentan habe ich JFreeChart hergenommen und modifiziert. Da aber die Werte teilweise extrem hoch sind (Millionenbereich) und ich diese Tachos als PNG buffer, dauert es teilweise 1-2 Sekunden. Ich suche zwar das Problem, möchte mich aber jetzt schon nach einer Alternative umsehen. 
Hat von euch jemand Erfahrung mit Tachos oä gemacht?

Ich wäre sehr dankbar 

Gruß

sutcha

PS: sorry für den doppelten Thread, hab ihn nicht 2 mal erstellt


----------



## StFighter (20. Sep 2007)

Vielleicht versteh ich deine frage nicht ganz richtig, aber du erzeugst bei jeder änderung des wertes einen neuen chart, zeichnest die nadel ein speicherst das bild als png, lädts es rein und stellst es dar???

Wie stellst du überhaupt den Tacho dar? mit swing?

Wenn ja, lade den Tacho als Hintergrund als BufferedImage, erzeuge eine Klasse, leite sie von JPanel ab, redefiniere paint() und zeichne darin a) den Hintergrund b) die Nadel mit den zeichenfunktionen der Graphics2D Klasse.

Hoffe das entspricht etwa dem was du suchst


----------



## sutcha (20. Sep 2007)

Das wird alles in SWT dargestellt. Ich buffer es als SWT-Image.

Der Chart wird immer neu gezeichnet und neu geladen. Ich werd jetzt mal TPTP laufen lassen, um zu schaun, wo genau er so lange braucht.


----------



## sutcha (20. Sep 2007)

Gibts sonst irgendwelche bestehenden Libs? Irgendwie hab ich ziemliche Probleme beim Performance-Test meiner bestehenden Methoden


----------



## Quaxli (20. Sep 2007)

StFighter hat Dir schon den richtigen Ansatz genannt. Du mußt das nur umsetzen.


----------



## sutcha (20. Sep 2007)

Momentan benutz ich einen Meter-Chart, buffer den als PNG und mach daraus ein SWT-Image und setz es als Label in einen Button der GUI.

Das Performance-Loch ist genau bei dem buffern des Charts. Wenn ich den Chart erstelle dauert das ca 16 ms, wenn ich die Grafik erstelle, also zwischenbuffer, dauert das 1750ms


----------



## StFighter (20. Sep 2007)

ich bin mir nicht sicher was du unter buffern verstehst.
speicherst du das chart echt auf der festplatte?
wenn ja, überlegt dir mal wieviel daten da über deine ide-schnittstelle und über die !mechanik! der festplatte laufen.
kein wunder das hier jedes system in die knie geht.

Das wäre so als ob du durch die Wüste Gobi wanderst um ein glas wasser zu holen.

wie auch immer du deinen tacho renderst.
der einzige speicher den du zum rendern verwendest darf dein hauptspeicher sein, sonst wirst du eines tagen eine ganz ganz traurige zerfetzte festplatte vorfinden  :wink:


----------



## sutcha (20. Sep 2007)

keine Angst, das wird nur zwischengespeichert   ByteArrayOutputStream -> ByteArrayInputStream und dann daraus ein SWT-Image. 
Ich vermute, dass er beim schreiben vom PNG unnötige Sachen macht. Beim Tacho ist es eigetnlich egal, ob er von 1-100 oder von 1-10000000 geht, lediglich der Wert ist höher, aber der Tacho bleibt gleich und die relative Nadelposition auch, wenn ich zB 40 auf dem einen hab oder 4000000 auf dem anderen. 

PS: Kann es an der Kompression liegen, da es als PNG gebuffert wird?


----------



## StFighter (20. Sep 2007)

hmm png kompression ist meines wissens schon relativ aufwendig.
ich könnte mir auch denken das der ByteArrayOutputStream ziemlich performance vergeudet.
Warum ist das überhaupt nötig?
Ich kenn JFreeChart nicht, aber sicher gibts vernünfigere möglichkeiten in ein SWT-brauchbares image zu konvertieren.
meist liegen die bilddaten ja ohnehin als irgendeine form von bytearray vor.


----------



## sutcha (21. Sep 2007)

Das ist so eine Sache mit JFreeChart und SWT. Ich hab nichts sinnvolles gefunden, außer das hier

Selbst dieser Weg bringt mir nicht mehr performance:


```
// Draw the chart in an AWT buffered image 
				    BufferedImage bufferedImage 
				      = chart.createBufferedImage(width, height, null); 

				    // Get the data buffer of the image 
				    DataBuffer buffer = bufferedImage.getRaster().getDataBuffer(); 
				    DataBufferInt intBuffer = (DataBufferInt) buffer; 
				    
				    // Copy the data from the AWT buffer to a SWT buffer 
				    PaletteData paletteData = new PaletteData(0x00FF0000, 0x0000FF00, 0x000000FF); 
				    ImageData imageData = new ImageData(width, height, 32, paletteData); 
				    for (int bank = 0; bank < intBuffer.getNumBanks(); bank++) { 
				      int[] bankData = intBuffer.getData(bank); 
				      imageData.setPixels(0, bank, bankData.length, bankData, 0);      
				    }
```


----------

