# [ANIMATION] Hintergrundbild nur einmal zeichnen



## haui95 (25. Dez 2013)

Guten Tag,

ich bin gerade dabei eine Ampelsteuerung zu simulieren. Das Programm ist theoretisch fertig, jedoch wird die CPU bei der Ausführung zu 40 % ausgelastet. Ich habe eine Kreuzung als Hintergrundbild (BufferedImage) und auf diesem werden Autos auch in Form von Bildern bewegt und bei jeder Positionsänderung neu gezeichnet. Nun muss das statische Hintergrundbild eigentlich nur einmal gezeichnet werden, da es sich ja nicht ändert. Die CPU Auslastung ist dadurch sehr beeinflusst, zumal das Bild eine Größe von 900x600 Pixel hat. 

1.Frage: Ist es möglich, dass das Hintergrundbild nur einmal in der paintComponent() Methode des JPanels gezeichnet wird und trotzdem das Zeichnen der Autos kein komplettes leeren des Bildschirms zur Folge hat?

2. Frage:
Ich benutze für die Darstellung der Zeichenoperationen ein JPanel. Ein JPanel wird standardmäßig passiv gerendert und doppelt gepuffert. Nun habe ich mit BufferedImage ein eigenen Buffer erstellt und rendere das Bild aktiv. Ein deutlicher Performanceunterschied ist jedoch nicht spürbar. Wie lassen sich dann ein mehrfach wiederholtes neuzeichnen von Bildern optimieren, sodass die CPU nicht so stark beansprucht wird. Trotz dessen, dass meine Anwendung mit konstanten 60 FPS läuft, ruckelt es trotzdem an einigen Stellen.

Vielen Dank!

MfG

Hauke


----------



## jemandzehage (26. Dez 2013)

Moin,

also erstmal prinzipiell: Zeichnen in Swing ist immer relativ langsam, da viele Berechnungen über die CPU laufen. Das kannst du nur dadürch beschleunigen, indem du eine API verwendest, die Zugriff auf die Graphikkarte hat. Das wäre z.B. Lwjgl (oder seit Javs 7 javafx - aber auf Linux hilft das auch nicht weiter), aber dann würdest du wahrscheinlich nicht um einen komplettumbau deiner Anwendung herum kommen. Da das Programm bei 60 fps läuft und du das Gefühl hast, das es ruckelt kommt wahrscheinlich daher, dass du immer 16,66 Sekunden wartest ungeachtet dessen, dass das Zeichnen auch Zeit in Anspruch nimmt. Also musst du beim warten immer die Zeit Abziehen die das Rendern verbraucht hat. 

Grüße


----------



## TheSorm (3. Jan 2014)

Zur ersten frage: naja an sich mit einer boolean variable, die sich auf true stellt wenn das bild gezeichnet wird, und das hin tergrundbild wirt nur gezeichnet wenn diese variable auf false steht

also


```
if( hgb_gezeichnet ==false){
//zeichne hintergrundbild
hgb_gezeichnet==true;
}
```


----------



## Ruzmanz (3. Jan 2014)

Wenn die Autos über das statische Bild fahren, muss es immer neu gezeichnet werden. Ein häufiges Problem ist, dass manche Anfänger die Bilder nicht im RAM zwischenspeichern, sondern immer von der Festplatte lesen.


----------

