Zunächst mal, gerade vor kurzem hab ich hier im Forum etwas gelesen in der Art wie "thou shalt not use getGraphics", was ich irgendwie nicht ganz nachvollziehen kann. Wie kann man denn sonst noch in ein BufferedImage zeichnen, wenn ich mir kein Graphics-Objekt holen darf? Eine Begründung wäre da echt toll gewesen, weil die Aussage alleine hilft mir nicht.
Ich arbeite derzeit wieder mal an einem kleinen Experiment und da bin ich am überlegen, wie ich performant mit Swing arbeiten kann. Das Fensterchen (JFrame) hat kaum VGA-Auflösung, sollte aber mit 72 fps immer ein BufferedImage auf ein JPanel zeichen.
Im Moment ist das Bild testweise noch komplett schwarz. Mit Hilfe eines Timers lasse ich den Thread immer so lange schlafen, dass er mehr oder weniger genau auf diese 72 fps kommt (theoretisch wären 300 fps drin, laut Timer).
Was mich daran stört, ist, dass schon das simple Zeichnen dieses immergleichen schwarzen BufferedImages meinen Prozessor zu 15% auslastet, um auf die benötigte Bildwiederholrate zu kommen. Ich weiß nicht wie ihr das seht, aber ich finde das etwas viel. Wie sieht das dann erst aus, wenn ich komplizierte Berechnungen ausführe, um tatsächlich Bildschirminhalt zu erzeugen.
Nun habe ich gelesen, dass man repaint(x1,y1,x2,y2) überschreiben kann, damit NUR der Bereich neu gezeichnet wird, der sich verändert hat. Das wäre natürlich genau das richtige für mich, weil bei meinem Experiment komplette Bildbereiche immer gleich bleiben. Auch wenn das OS das Fenster anweist, einen Teil von sich neu zu zeichen, dann sollte mein JFrame sich die Arbeit sparen und eben nicht alles neu zeichnen. Nun nützt mir aber repaint nichts, wenn die paintComponent()-Methode, die ich überschreibe, keine Parameter nimmt und daher immer alles neu zeichnet.
Verstehe ich da was falsch oder ist paintComponent() da der falsche Weg? Wie macht man sowas besser?
Ich arbeite derzeit wieder mal an einem kleinen Experiment und da bin ich am überlegen, wie ich performant mit Swing arbeiten kann. Das Fensterchen (JFrame) hat kaum VGA-Auflösung, sollte aber mit 72 fps immer ein BufferedImage auf ein JPanel zeichen.
Im Moment ist das Bild testweise noch komplett schwarz. Mit Hilfe eines Timers lasse ich den Thread immer so lange schlafen, dass er mehr oder weniger genau auf diese 72 fps kommt (theoretisch wären 300 fps drin, laut Timer).
Was mich daran stört, ist, dass schon das simple Zeichnen dieses immergleichen schwarzen BufferedImages meinen Prozessor zu 15% auslastet, um auf die benötigte Bildwiederholrate zu kommen. Ich weiß nicht wie ihr das seht, aber ich finde das etwas viel. Wie sieht das dann erst aus, wenn ich komplizierte Berechnungen ausführe, um tatsächlich Bildschirminhalt zu erzeugen.
Nun habe ich gelesen, dass man repaint(x1,y1,x2,y2) überschreiben kann, damit NUR der Bereich neu gezeichnet wird, der sich verändert hat. Das wäre natürlich genau das richtige für mich, weil bei meinem Experiment komplette Bildbereiche immer gleich bleiben. Auch wenn das OS das Fenster anweist, einen Teil von sich neu zu zeichen, dann sollte mein JFrame sich die Arbeit sparen und eben nicht alles neu zeichnen. Nun nützt mir aber repaint nichts, wenn die paintComponent()-Methode, die ich überschreibe, keine Parameter nimmt und daher immer alles neu zeichnet.
Verstehe ich da was falsch oder ist paintComponent() da der falsche Weg? Wie macht man sowas besser?