# BufferedImage in VolatileImage casten



## Lulumann6 (26. Jan 2008)

hallo ich hab ein problem, und zwar schaffe ich es nicht mein BufferedImage in ein VolatileImage zu casten. Ich will ganz gerne, dass mein BufferedImage-array list in mein zukünftiges globales VolatileImage-array background gecastet wird. so wie der code jetzt ist funktioniert er auch.

hier mal ein wenig code (in zeile 43 brauche ich hilfe):


```
import java.awt.*;
import java.awt.image.*;
import javax.imageio.ImageIO;


public class BackgroundManager{
	private int windowWidth;
	private int windowHeight;
	
	private int imageWidth;
	private int number = 0;
	

	private BufferedImage[] background; //das soll zu VolatileImage[] background gemacht werden
	
	public BackgroundManager(int windowWidth, int windowHeight, String backgroundURL) {
		this.windowHeight = windowHeight;
		this.windowWidth = windowWidth;

		BufferedImage background;
		
		BufferedImage[] list;
		

		
		try{
			background = ImageIO.read(getClass().getClassLoader().getResource(backgroundURL));
			imageWidth = background.getWidth();
			number = background.getWidth() / 100;
			 
				if(background.getWidth()%number > 0){	
					list = new BufferedImage[number+1];
					list[number] = background.getSubimage(number*100, 0, imageWidth%100, background.getHeight());
				}
				else{
					list = new BufferedImage[number];
				}
			for(int cnt = 0; cnt < number; cnt++){
				list[cnt] = background.getSubimage(cnt*100, 0, 100, background.getHeight());
			}
		

			this.background = list; //hier sitzt der knackpunkt
                              

		}
		catch(Exception e){
			
			System.out.println(e.toString());
		}

		
		
	}
	
	
	public void draw(Graphics dbg, Screen screen){
		
		int posn = screen.x/imageWidth/2;
		int cnt = posn;
		int cntEnd = 11 + posn;
		while(cnt < cntEnd){
			
			cnt++;
			try{

				dbg.drawImage(this.background[(screen.x/100 + cnt)%(number+1)], -screen.x%100+cnt*100-100+((screen.x/100 + cnt)/(number+1)*(1-background[number].getWidth())), 0, null);
			}
			catch(Exception e){
				System.out.println(e.toString());
			}

		}


	}
	
}
```


----------



## Quaxli (26. Jan 2008)

Ich seh da nirgendwo ein VolatileImage....  ???:L 
Prinzipiell wird ein VolatileImage aber nicht gecastet, sonder ein BufferedImage wird reingemalt.

Zwei Anmerkungen:

1. Techn. Lösung: Du erzeugst ein VolatileImage. Holst Dir von diesem das Graphics-Objekt und mals Dein BufferedImage da rein. Fertig.

2. Forensuche hätte was gebracht. Schau mal in den gar nciht so alten Thread "Tile-Map ruckelt" hier in diesem Unterforum, da haben wir das großteils diskutiert. Auch wie man ein VolatileImage prinzipiell einsetzt.


----------



## Lulumann6 (26. Jan 2008)

> Ich seh da nirgendwo ein VolatileImage....


Zeile 14 background muss zukünftig zum volatile gemacht werden.

Deinen Thread hab ich mir schon angesehen, dass hat mir aber eigenltich nicht wirklich was gebracht.

ich glaub mein problem ist irgendwie, dass ich nicht genau weis wie ich ein VolatileImageArray machen soll  :bae:


----------



## Wildcard (26. Jan 2008)

Warum denkst du das es sinnvoll ist mehr als ein VolatileImage zu haben?
Warum willst du überhaupt *ein* VolatileImage haben?


----------



## Lulumann6 (26. Jan 2008)

ich will ein marioclon bauen, und bislang lief noch alles super, aber seitdem ich den hintergrund mit reingebaut habe, ist die cpu auslastung auf 100%,


> Warum denkst du das es sinnvoll ist mehr als ein VolatileImage zu haben


da der hintergrund in mario immer wieder von vorne anfängt, habe das bild in 100 pixel stücke aufgeteilt, damit immer nur der teil der sichtbar ist auch gezeichnet wird.


----------



## Evolver (26. Jan 2008)

Nur ein VolatileImage als Bilschirmpuffer beim Rendern verwenden. Für alles andere kannst du z.B. BufferedImage verwenden, da bring dir VolatileImage nichts.


----------



## Wildcard (26. Jan 2008)

Lulumann6 hat gesagt.:
			
		

> ich will ein marioclon bauen, und bislang lief noch alles super, aber seitdem ich den hintergrund mit reingebaut habe, ist die cpu auslastung auf 100%,


Ein VolatileImage spart mitnichten CPU Zyklen. Lediglich der Vorgang wechsel von einem Bild auf das nächste lässt sich damit flüssiger realisieren.
Die CPU arbeitet immer mit 100%, es sei denn sie schläft. Ergo: zu wenig/zu kurz sleep aufgerufen.


----------



## Lulumann6 (26. Jan 2008)

befor ich den hintergrund in mein spiel mit einprogrammiert habe lief alles noch mit unter 20% cpu und 60 fps, jetzt mit hintergrund hab ich nur noch 16 fps. und es liegt wirklich nur am hintergrund. wie soll ich denn meine fps wieder hoch bekommen? ich hab gedacht das der rechner bei bufferimage das ganze image vom arbeitsspeicher zur grafikkarte sendet, das wird doch wohl meine cpu in die höhe treiben, dann müsste es doch mit volatileimage besser gehen.


----------



## Lulumann6 (27. Jan 2008)

Alles klar ich hab mein problem gefunden Mein hintergrundbild war zuerst ein png. jetzt mit jpg sieht es genau so gut aus und leuft wied einwandfrei. also brauche  wohl doch kein volatileimage^^


----------



## Wildcard (27. Jan 2008)

Du kannst auch ein png nehmen, solltest dann aber selbst dafür sorgen, dass du ein ColorModel ohne Alpha Kanal nimmst.


----------



## Lulumann6 (27. Jan 2008)

achso, danke für den tip


----------

