# Extreme Prozessorauslastung durch Hintergrundbild



## Fu3L (3. Okt 2008)

Moin,

ich bin dabei ein kleines 2D-Spiel zu schreiben und würde dabei später gerne auch eine Art von Karte verwenden. Nur dass diese wahrscheinlich nicht aus kleinen Tiles, sodnern aus recht großen Bildern bestehen wird...
Jetzt hab ich aber schon bei einem unbeweglichen Hintergrundbild eine Prozessorauslastung von 100%.  Ich rufe dabei alle 10 Millisekunden repaint() für mein JPanel auf. Der Code in paintComponent sieht so aus:


```
@Override
	public void paintComponent(Graphics g) {
		
		super.paintComponent(g);
		//setBackground(new Color(255, 255, 0));
		g.drawImage(background[0], 0, 0, this);

		einzeller.drawObject(g);		
		
	} //Ende paintComponent()
```

Wenn ich das Hintergrundbild weglasse sorgt alles andere (darunter das zeichnen von einzeller.drawObject(g)) für eine Auslastung von nur 15%.
Jetzt frage ich mich, wie das kommt? Mein PC schafft Spiele wie "Der Herr der Ringe - Die Schlacht um Mittelerde 2" mit guter Grafikeinstellung, hat aber bei einem einfachen Hintergrundbild eine 100% Auslastung... (Allerdings hab ich das Auslastungsproblem in einem Prozessorkern auch schon bei einigen Flash-Werbungen gehabt...)

Als Lösung habe ich überlegt, den Hintergrund des JPanel durchsichtig zu machen und das Hintergrundbild in ein Panel darunterzuzeichnen und das halt nur einmal, aber wenn ich das Bild später bewegen will, bringt das natürlich auch nichts mehr... 

Weiß jemand vllt wie man das Problem lösen kann? :bahnhof:


----------



## Lulumann6 (3. Okt 2008)

welches bildformat hat dein hintergrund?
wenn es png ist, musst du dafür sorgen, dass du ein colormodel ohne alphakanal nimmst. (oder du benutzt z.B. jpg)


----------



## Marco13 (3. Okt 2008)

Abgesehen davon: Mit einem repaint() alle 10 ms erwartest du, dass er das Bild _mindestens 100 mal pro Sekunde komplett neu zeichnet.... Das ist schon viel. Mit 50ms wäre es vermutlich schon besser, aber wie schon angedeutet wurde, kommen da noch andere Punkte dazu, die aus dem geposteten Schnipselchen nicht hervorgehen.... (Angefangen von "Wie groß ist das Bild?" bis "Welches Colormodel wird verwendet?" o.ä. ...)_


----------



## Fu3L (3. Okt 2008)

@Lulumann6: Stimmt es ist png und es ist deutlich schneller mit nem jpg, allerdings hab ich dann noch das Problem, dass es mit sehr vielen Figuren auf dem Bild (die müssen leider .png bleiben, da die verschiedene Transparenzwerte enthalten) auch langsamer wird. Ich kenn mich zwar (noch) nicht mit Colormodels aus (werd ich gleich nachlesen), aber "colormodel ohne alphakanal" hört sich für mich so an, als wenn dann die Transparenz wegfällt?

@Marco13: Ich hab mich da an Quaxlis-Spiele-Tutorial orientiert, aber wenn eine Aktualisierung alle 50 ms für nen flüssigen Spielfluss ausreicht, wäre das natürlich gut  :!: 
Das Bild ist 1000x1000 Pixel groß. Da fällt mir gleich noch ne Frage ein: Was kann schneller aufgebaut werden: Ein großes Bild oder viele kleine? Weil bei einer Tile-Map wird ja auch ein Bild das ungefähr so groß ist aus den vielen kleinen Bildern erzeugt...


----------



## Quaxli (4. Okt 2008)

Google mal nach "Killer Game Programming" und such dort mal das Kapitel über aktives Rendern raus, da findest Du sicherlich viele gute Tipps, was die Frame-Rate betrifft. Dort findest Du auch einen Schrittweisen Aufbau des Render-Prozesses von einfach nach komplex, der für Dich interessant sein dürfte.

Wenn Dein Bild 1000 x 1000 Pixel groß ist, wird es vermutlich nicht komplett angezeigt, oder? Dann könnte eine Tile-Map unter Umständen Vorteile bringen.


----------



## Fu3L (4. Okt 2008)

Hab mir jezz Kapitel 2 und 5 durchgelesen und muss erstma Pause machen (die Schrift is so schön scharf  :autsch: )
Bis jetzt hab ich nur Sachen gelesen, die schon in deinem Tutorial drin stehen, wenn ich nichts überlesen hab^^ Die Sachen (VolatileImage und die Umstellung aufn Canvas usw.) hab ich gestern schon eingebaut. (Übrigends großes Lob für das Tutorial  :wink: )
Das einzige was ich noch rausgelesen hab, ist, dass ich mit dem ColorModel wohl auch nichts mehr rausholen kann, wenn ich die verschiendenen Transparenzwerte eines PNG-Bildes brauche (Seh ich das richtig?)

Und es stimmt, das Bild wird nicht komplett angezeigt und da ich später wahrscheinlich mehrere dieser Bilder aneinanderlegen werde, wirds wohl das beste sein, das nochmal zu zerstückeln...


----------

