Hallo,
ich habe das Problem, dass in meiner Software Bilder im 20Hz Takt gezeichnet und dargestellt werden sollen. Die Bilder haben eine Größe von 512x400 Pixel und sind in der Software als BufferedImage definiert. Auf dieses Image wird mit einem timer.scheduleAtFixedRate()-Aufruf alle 50ms ein Datensatzt bestehend aus 512 Koordinatenpunkten eine Kurve auf das BufferedImage gezeichnet. Zum Zeichnen benutze ich ein Java2D Graphics Objekt.
Zunächst wird mit einem GeneralPath die darzustellende Kurve erstellt, und anschließend auf das BufferedImage gezeichnet.
Das Problem ist, dass die CPU Belastung bei der Bildgröße 512x400 Pixel annähernd 100% beträgt. Es handelt sich um einen 1,8GHz Pentium 4 Computer. Verringere ich die Größe des BufferedImages auf 512x350 Pixel ist die CPU Belastung deutlich zurückgegangen. Komisch ist auch, das die CPU Belastung kleiner wird, wenn ich das original große Image mit einem anderen Fenster zum Teil verdecke. Also, das Programm läuft und zeichnet die Kurven mit 20Hz. Die CPU Belastung ist bei fast 100%. Nehme ich nun ein anderes Anwendungsfenster und verdecke mit diesem nur einen Teil des BufferedImages auf dem Bildschirm (so, dass ich noch sehen kann, dass darauf die Kurven gezeichnet werden), so geht die CPU Belastung auch deutlich zurück.
Für mich sieht das so aus, als ob die CPU ständig die Pixel-Daten des Bildes vom Hauptspeicher zur Grafikkarte schaufeln muss, und dabei ab einer bestimmten Bildgröße nicht mehr hinterherkommt.
Die Frage ist nun, wie ich mein Bild direkt im Grafikkartenspeicher ablegen kann, um die CPU überhaupt nicht mehr zu belasten. Ich habe auch schon das VolatileImage ausprobiert, das ja angeblich direkt hardwarebeschleunigt wird. Leider hatte ich dort genau die selben Performanceprobleme. Ach ja, die Grafikkarte hat einen Radeon 9000 mobility Chip mit 64MB RAM. Diese sollte doch mein kleines Bild gut zeichnen können, oder?
Nun gibt es ja die sogenannten Java-Features (z.B. "-Dsun.java2d.opengl=True"). Die scheinen allerdings keinen Effekt zu haben.
Kann mir jemand von euch eine generelle Vorgehensweise empfehlen, wie man am Besten versuchen sollte die Hardwarebeschleunigung für Java2D zu aktivieren? Leider habe ich dazu auch nicht viel aussagekräftiges Material im Web gefunden.
Gruß,
Maik
ich habe das Problem, dass in meiner Software Bilder im 20Hz Takt gezeichnet und dargestellt werden sollen. Die Bilder haben eine Größe von 512x400 Pixel und sind in der Software als BufferedImage definiert. Auf dieses Image wird mit einem timer.scheduleAtFixedRate()-Aufruf alle 50ms ein Datensatzt bestehend aus 512 Koordinatenpunkten eine Kurve auf das BufferedImage gezeichnet. Zum Zeichnen benutze ich ein Java2D Graphics Objekt.
Zunächst wird mit einem GeneralPath die darzustellende Kurve erstellt, und anschließend auf das BufferedImage gezeichnet.
Das Problem ist, dass die CPU Belastung bei der Bildgröße 512x400 Pixel annähernd 100% beträgt. Es handelt sich um einen 1,8GHz Pentium 4 Computer. Verringere ich die Größe des BufferedImages auf 512x350 Pixel ist die CPU Belastung deutlich zurückgegangen. Komisch ist auch, das die CPU Belastung kleiner wird, wenn ich das original große Image mit einem anderen Fenster zum Teil verdecke. Also, das Programm läuft und zeichnet die Kurven mit 20Hz. Die CPU Belastung ist bei fast 100%. Nehme ich nun ein anderes Anwendungsfenster und verdecke mit diesem nur einen Teil des BufferedImages auf dem Bildschirm (so, dass ich noch sehen kann, dass darauf die Kurven gezeichnet werden), so geht die CPU Belastung auch deutlich zurück.
Für mich sieht das so aus, als ob die CPU ständig die Pixel-Daten des Bildes vom Hauptspeicher zur Grafikkarte schaufeln muss, und dabei ab einer bestimmten Bildgröße nicht mehr hinterherkommt.
Die Frage ist nun, wie ich mein Bild direkt im Grafikkartenspeicher ablegen kann, um die CPU überhaupt nicht mehr zu belasten. Ich habe auch schon das VolatileImage ausprobiert, das ja angeblich direkt hardwarebeschleunigt wird. Leider hatte ich dort genau die selben Performanceprobleme. Ach ja, die Grafikkarte hat einen Radeon 9000 mobility Chip mit 64MB RAM. Diese sollte doch mein kleines Bild gut zeichnen können, oder?
Nun gibt es ja die sogenannten Java-Features (z.B. "-Dsun.java2d.opengl=True"). Die scheinen allerdings keinen Effekt zu haben.
Kann mir jemand von euch eine generelle Vorgehensweise empfehlen, wie man am Besten versuchen sollte die Hardwarebeschleunigung für Java2D zu aktivieren? Leider habe ich dazu auch nicht viel aussagekräftiges Material im Web gefunden.
Gruß,
Maik