Rotieren eines 2D Images endet in Java heap space Error

Status
Nicht offen für weitere Antworten.

just4fun

Mitglied
Guten Tag,
es geht um folgendes:
Ich habe eine 2000x2000 pixel map. Diese soll sich um 3° Drehen, wenn man die rechte Pfeiltaste drückt.
Das funktioniert folgendermaßen:
Beim init ist folgendes enthalten:
Code:
    MediaTracker mt = new MediaTracker(this);
    mt.addImage(arena, 0);
    try {
        mt.waitForID(0);
    } 
    catch (InterruptedException ie) {
    }
Dieses komtm dann, wenn die map geladen ist:
Code:
    Tarena = new BufferedImage(2000, 2000, BufferedImage.TYPE_INT_ARGB);
    Graphics2D g = (Graphics2D) Tarena.getGraphics();
    //arena ist das Image was auf die 2000x2000 px map verweist
    g.drawImage(arena, 0, 0, null);
Und dann passiert folgendes, wenn man auf die rechte bzw. linke Pfeiltaste drückt:
Code:
    bio = new AffineTransformOp(AffineTransform.getRotateInstance(3.0* Math.PI / 180, Xchar, Ychar),AffineTransformOp.TYPE_NEAREST_NEIGHBOR); 
    Tarena = bio.filter(Tarena, null);


Danach wird das Bild halt gezeichnet, was auch funktioniert. Nach etwa sieben Drehungen aber, erscheint folgender Fehler:
Exception in thread "Timer-0" java.lang.OutOfMemoryError: Java heap space
at java.awt.image.DataBufferInt.<init>(DataBufferInt.java:41)
at java.awt.image.SinglePixelPackedSampleModel.createDataBuffer(SinglePixelPackedSampleModel.java:220)
at sun.awt.image.IntegerInterleavedRaster.<init>(IntegerInterleavedRaster.java:55)
at sun.awt.image.IntegerInterleavedRaster.createCompatibleWritableRaster(IntegerInterleavedRaster.java:515)
at java.awt.image.AffineTransformOp.createCompatibleDestImage(AffineTransformOp.java:448)
at java.awt.image.AffineTransformOp.filter(AffineTransformOp.java:209)

Der Fehler passiert bei der Zeile:
Code:
Tarena = bio.filter(Tarena, null);


Was ist nun der Grund für den Fehler? Nach genau sieben Rotationen? Wird das alte Bild nicht aus dem Speicher gelöscht? Wenn ja, wie kann ich das rauslöschen? Ein System.gb() vor dem bio.filter hat nicht geholfen. Rotieren funktioniert mit einem kleineren Bild (z.B. 32*32 px) super(gibt keinen error). Ist die map einfach zu groß?


Danke für Eure Antworten!

Finn
 

Marco13

Top Contributor
Dass das nach "einigen" Schritten passiert, deutet eigentlich auf ein Memory Leak hin. I.a. kann man bei einem "java.lang.OutOfMemoryError: Java heap space" einfach sein Programm mit
java -Xmx256m MeinProgramm
starten. Falls da dann nach 20 oder 30 Schritten das gleiche Problem auftritt, hast du offenbar ein Memory Leak. Dann müßtest du compilierbren Code posten, bei dem das Problem auftritt.
 

manuche

Bekanntes Mitglied
Setz einfach mal deine Objekte die du nicht mehr brauchst am ende der Methode auf null und ruf den GarbageCollector auf...
Eigentlich sollte das zwar automatisch passieren aber man weiss ja nie!
 

manuche

Bekanntes Mitglied
Ich gehe mal davon aus, dass das Drehen komplett in der keyPressed-Methode stattfindet, oder? Schreib am besten mal die ganze Methode damit man nachvollziehen kannst wie du mit den Objekten umherschmeisst dass es zu nem Stackoverflow kommt :D
 

just4fun

Mitglied
Danke für die schnellen Antworten!

Sollte das nicht auch funktionieren, ohne den Speicher zu erhöhen? Oder nur um rauszufinden ob es ein Memory Leak ist?

Und dazu:
manuche hat gesagt.:
Setz einfach mal deine Objekte die du nicht mehr brauchst am ende der Methode auf null und ruf den GarbageCollector auf...
Eigentlich sollte das zwar automatisch passieren aber man weiss ja nie!

Ist das denn nötig? Das BufferedImage Tarena wird ja immer neu überschrieben, das muss man dann ja nicht auf null setzen?


Ich werde später mal den Code posten.

Finn
 

just4fun

Mitglied
Okay, habe das mal probiert mit -Xmx256m. Ja, ich bekomme nun 21 Rotationen hin -> Also ist es ein Memory Leak. Hilft immer, wenn man weiß, wo das Problem liegt. Da haben wir schonmal einen Schritt geschafft.^^



Hier ist dann der Code:
Code:
import java.awt.*;
import java.awt.image.ImageObserver;
import java.awt.event.*;
import java.util.*;
import java.lang.*;
import java.io.*;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.awt.image.BufferedImageOp;
import java.awt.geom.AffineTransform;

public class RotationTest extends Frame implements KeyListener{
	
	//Dieses Image ist 2000x2000 px groß, und soll rotiert werden.
	Image map = Toolkit.getDefaultToolkit().getImage(getClass().getResource("map.gif"));
	
	//Nach jeder Rotation wird BackgroundImage = RotatedMap; gesetzt.
	Image BackgroundImage = map;
	
	BufferedImage RotatedMap;
		
	BufferedImageOp bio;
	
	double curAngle = 0.0;
	
	//RotationTest wird gestartet
    public static void main(String[] args)
    {
        RotationTest starter = new RotationTest();
        starter.show();
    }

    public RotationTest() {
		super("RotationTest");
		setBackground(Color.white);    	
    	setSize(700,500);
		setLocation(0,0);
		setVisible(true);
		addKeyListener(this);
      		
	    MediaTracker mt = new MediaTracker(this);
	    mt.addImage(map, 0);
	    try {
	    	mt.waitForID(0);
	    } 
	    catch (InterruptedException ie) {
	    }

		RotatedMap = new BufferedImage(2000, 2000, BufferedImage.TYPE_INT_ARGB);
		Graphics2D g = (Graphics2D) RotatedMap.getGraphics();
    	g.drawImage(map, 0, 0, null);
    	repaint();
    }
    
    public void keyPressed(KeyEvent e) {
    	int k = e.getKeyCode();
    	
    	//KeyCode 37 ist die linke Pfeiltaste. Das Bild wird um 3° nach links gedreht.
    	if(k == 37) {
			bio = new AffineTransformOp(AffineTransform.getRotateInstance(-3.0* Math.PI / 180, 0, 0),AffineTransformOp.TYPE_NEAREST_NEIGHBOR);  	
	    	RotatedMap = bio.filter(RotatedMap, null);
	    	BackgroundImage = RotatedMap;
	    	repaint();
	    	curAngle-=3.0;	    	
	    	System.out.println("Current Angle:" + curAngle);	    	
    	}
		//KeyCode 39 ist die rechte Pfeiltaste. Das Bild wird um 3° nach rechts gedreht.    	
     	if(k == 39) {
			bio = new AffineTransformOp(AffineTransform.getRotateInstance(3.0* Math.PI / 180, 0, 0),AffineTransformOp.TYPE_NEAREST_NEIGHBOR);  	
	    	RotatedMap = bio.filter(RotatedMap, null);
	    	BackgroundImage = RotatedMap;
	    	repaint();
	    	curAngle+=3.0;	    	
	    	System.out.println("Current Angle:" + curAngle);	    	
    	}   	
    }
    public void keyReleased(KeyEvent e) {
    }
    public void keyTyped(KeyEvent e) {
    }    
    	
	public void paint(Graphics g) {
		g.drawImage(BackgroundImage, -1000, -1000, this);
	}
}


Das einzige was man braucht um dies zu testen, ist ein 2000x2000px großes Bild benannt 'map.gif'(Am Besten nicht einfarbigen, sonst kann man den Rotationseffekt nicht sehen).

Nach einigen Rotationen stürzt das Programm dann ab.

Was noch besser wäre, wenn anstatt das schon veränderte Bild um immer 3° zu drehen, wäre, wenn man das Anfangsbild um curAngle - 3.0/curAngel + 3.0 drehen würde, weil das die Qualität verbessert. Dann aber stürzt das Program nach zwei Rotationen ab.


Finn


PS.:
Hier ist das Image map.gif, das ich benutzt habe(Auf das Bild klicken und dann rechts-Klick 'Speichern als...'):
 

manuche

Bekanntes Mitglied
Probier mal folgendes:
Code:
bio.filter(RotatedMap, rotatedMap);
statt
Code:
rotatedMap= bio.filter(RotatedMap, null);
habe das hier in der Doku gefunden:
Performs a single-input/single-output operation on a BufferedImage. If the color models for the two images do not match, a color conversion into the destination color model is performed. If the destination image is null, a BufferedImage with an appropriate ColorModel is created.
Ist allerdings nur eine Vermutung da ich in dem Umfeld nicht allzuviel Erfahrung habe!

Noch was: Gewöhn dir ab Methoden und Variablen groß zu schreiben... In Java werden sie KLEIN geschrieben!
 

just4fun

Mitglied
Ne, mit
Code:
bio.filter(RotatedMap,rotatedMap)
bringt keine Verbesserung.

Danke aber auf jedenfall, dass du versuchst zu helfen.^^

Und der Tipp mit dem Kleinschreiben ist auf jedenfall etwas, dass ich jetzt auch weiß. Danke sehr!

Finn
 

manuche

Bekanntes Mitglied
Hat es eigentlich einen Grund warum du AffineTransformOp und BufferedImageOp bentutz?
Nicht das es einfach nur Overhead ist...
 

manuche

Bekanntes Mitglied
Code:
import java.awt.*; 
import java.awt.event.*;  
import java.io.*; 
import java.net.URL; 
import java.awt.image.BufferedImage; 
import java.awt.geom.AffineTransform; 

import javax.imageio.ImageIO;

public class RotationTest extends Frame implements KeyListener{ 
    
   BufferedImage map = this.loadImg("map.gif");
   BufferedImage backgroundImage = map;
    
   double curAngle = 0.0; 
    
    public static void main(String[] args) 
    { 
        RotationTest starter = new RotationTest(); 
        starter.show();
    } 

    public RotationTest() { 
      super("RotationTest"); 
      setBackground(Color.white);        
       setSize(700,500); 
      setLocation(0,0); 
      setVisible(true); 
      addKeyListener(this);  
    } 
    
    public void keyPressed(KeyEvent e) { 
       int k = e.getKeyCode(); 
       if (k == 37 || k == 39) { 
	       //KeyCode 37 ist die linke Pfeiltaste. Das Bild wird um 3° nach links gedreht. 
	       if(k == 37) { 
	          curAngle-=3.0;           
	          System.out.println("Current Angle:" + curAngle);           
	       } 
	       //KeyCode 39 ist die rechte Pfeiltaste. Das Bild wird um 3° nach rechts gedreht.        
	       if(k == 39) {
	          curAngle+=3.0;           
	          System.out.println("Current Angle:" + curAngle);           
	        }
	        BufferedImage tempImage = new BufferedImage (map.getWidth(), map.getHeight(), BufferedImage.TRANSLUCENT);
	        Graphics2D g2d = (Graphics2D) tempImage.getGraphics ();
	        AffineTransform aft = new AffineTransform ();
	        aft.rotate (Math.toRadians (curAngle), map.getWidth () / 2, map.getHeight () / 2);
	        g2d.drawImage (map, aft, null);
	        g2d.dispose();
	        backgroundImage = tempImage;
	        this.repaint();
       }
    } 
    public void keyReleased(KeyEvent e) { 
    } 
    public void keyTyped(KeyEvent e) { 
    }    
        
   public void paint(Graphics g) { 
      g.drawImage(backgroundImage, -1000, -1000, this); 
   } 
   
   private BufferedImage loadImg (String pPath){
		URL pic_url = getClass ().getClassLoader ().getResource (pPath);
		BufferedImage source = null;
		try{
			source = ImageIO.read (pic_url);
		}catch (IllegalArgumentException iae){
			iae.printStackTrace();
		}catch (IOException ioe){
			ioe.printStackTrace();
		}
		return source;
	}
}

Probier das mal... Habs jetzt nicht nen paar tausendmal auf nen Pfeil gedrückt aber schien mir zu funktioneren! ^^
 

manuche

Bekanntes Mitglied
Nicht zwingend erforderlich da der GarbageCollector das gleich macht allerdings defenitiv die saubere Variante!
Danke werd es direkt noch nachtragen...
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Rotieren eines Objekts (2D) Spiele- und Multimedia-Programmierung 8
W Affine Transformation, Rotieren eines Objekts Spiele- und Multimedia-Programmierung 2
B MarioKart Map rotieren? Spiele- und Multimedia-Programmierung 6
D 2D Pixelbild rotieren Spiele- und Multimedia-Programmierung 3
TulPe Würfel per Mausklick rotieren Spiele- und Multimedia-Programmierung 10
Creylon [LWJGL] 2D Sprite Rotieren/Drehen Spiele- und Multimedia-Programmierung 6
B j3d mehr als ein Objekt rotieren Spiele- und Multimedia-Programmierung 18
M [Java3D] Rotieren der Scene NICHT des POV Spiele- und Multimedia-Programmierung 4
Developer_X 3D Point rotieren lassen Spiele- und Multimedia-Programmierung 17
S Schiff in Richtung der Maus rotieren - Problem :/ Spiele- und Multimedia-Programmierung 5
Tr3kk3r Kamera nur um x und y, nicht um z achse rotieren Spiele- und Multimedia-Programmierung 2
D Dreieck um den Mittelpunkt rotieren lassen Spiele- und Multimedia-Programmierung 9
P Rechteck rotieren und frontal anzeigen Spiele- und Multimedia-Programmierung 2
A Objekte nacheinander zeitgesteuert rotieren lassen Spiele- und Multimedia-Programmierung 4
N Seltsame Exception bei Code eines Spiele-Tutorials Spiele- und Multimedia-Programmierung 6
R Ideen für die Backend-Entwicklung eines Games gesucht Spiele- und Multimedia-Programmierung 8
A Programmieren eines Memorys mit Java (in Eclipse) Spiele- und Multimedia-Programmierung 5
T Position eines Image verändern mithilfe eines Timers Spiele- und Multimedia-Programmierung 6
E Programmierung eines 2.5D Point&Click Adventures ohne Spieleengine machbar? Spiele- und Multimedia-Programmierung 14
K Click innerhalb eines 45° gekippten Rechtecks Spiele- und Multimedia-Programmierung 9
J LibGdx_3D: Klamotten eines Charakters modifizieren Spiele- und Multimedia-Programmierung 2
K Erstellen eines Fotoalbums mit Java Spiele- und Multimedia-Programmierung 8
R Fehler beim Laden eines 2D-Bildes Spiele- und Multimedia-Programmierung 3
L OpenGL TransformationMatrix eines Flugzeugs Spiele- und Multimedia-Programmierung 2
M Programmierung eines "Fantasy Rollenspiels" Spiele- und Multimedia-Programmierung 5
E Laufanimation eines Sprites Spiele- und Multimedia-Programmierung 6
Finalspace Entwicklung eines Jump & Run Spiels Video-Tutorial Spiele- und Multimedia-Programmierung 12
T Hintergrundmusik eines Spiels mit Hilfe von JLayer Spiele- und Multimedia-Programmierung 12
M Cylinder anhand eines Vektors ausrichten (Java3d) Spiele- und Multimedia-Programmierung 0
M bewegen eines Objektes Spiele- und Multimedia-Programmierung 2
U Hilfe bei Implementierung eines PointSounds in Java3D Spiele- und Multimedia-Programmierung 1
gamebreiti Index eines Elements einer ArrayList abfragen Spiele- und Multimedia-Programmierung 1
X "Rebuffen" - Messen der Zeit eines Timers Spiele- und Multimedia-Programmierung 3
S Design eines Schachspiels Spiele- und Multimedia-Programmierung 3
S Mausklicks innerhalb eines JFrames/SWTBrowser ohne richtige Maus simulieren Spiele- und Multimedia-Programmierung 6
F Programmierung eines Bots Spiele- und Multimedia-Programmierung 23
A Wann ist ein Punkt inerhalb eines Polygons? Spiele- und Multimedia-Programmierung 2
F LWJGL Problem mit Erstellen eines Objekts und der Kamera Spiele- und Multimedia-Programmierung 5
R Drehen eines Bildes relativ zur Mauszeigerposition Spiele- und Multimedia-Programmierung 2
M Pattern zur Auswahl eines Objektes anhand vieler Kriterien Spiele- und Multimedia-Programmierung 2
H Skalierung eines Polygons ohne das es verschoben wird Spiele- und Multimedia-Programmierung 3
R Triangulation eines komplexen Polygons Spiele- und Multimedia-Programmierung 4
L Lwjgl Darstellung eines Kreises im Raum Spiele- und Multimedia-Programmierung 3
M Pixel eines BufferedImage bearbeiten (Performance) Spiele- und Multimedia-Programmierung 23
F nur Ausschnitt eines Image zeichnen Spiele- und Multimedia-Programmierung 9
S Umfang eines Polygons erzeugen Spiele- und Multimedia-Programmierung 1
D Highscoreliste eines Applets funktioniert online nicht Spiele- und Multimedia-Programmierung 4
W CannotRealizeException (jmf) beim abspielen eines liedes Spiele- und Multimedia-Programmierung 3
F Meine Aufgabe: Client-Server am Beispiel einer Implementation eines Tic-Tac-Toe Netzwerkspieles Spiele- und Multimedia-Programmierung 7
D Koordinaten eines 2D Sprites Spiele- und Multimedia-Programmierung 2
B Teile eines Bildes laden - BitBlk und drawImage Spiele- und Multimedia-Programmierung 3
S Interpolation eines Bildes Spiele- und Multimedia-Programmierung 6
S Problem beim laden eines Bildes in einer Methode Spiele- und Multimedia-Programmierung 14
N Bildposition innerhalb eines anderen Bildes ermitteln Spiele- und Multimedia-Programmierung 2
G rotation eines würfels Spiele- und Multimedia-Programmierung 9
G Bewegung eines Grafikobjektes Spiele- und Multimedia-Programmierung 7
A Programmieren eines Bruchrechners Spiele- und Multimedia-Programmierung 3
H Decke zeichnen mit Hilfe eines Polygons Spiele- und Multimedia-Programmierung 2
S fließende/bewegende Striche eines Auswahlrechtecks Spiele- und Multimedia-Programmierung 9
A Bounds eines gedrehten Objekts berechnen Spiele- und Multimedia-Programmierung 30
T Erstellen eines ausdruckbaren Formulars Spiele- und Multimedia-Programmierung 5
T Umsetzung eines 2D Jump and Runs Spiele- und Multimedia-Programmierung 7
T Brightness eines Bildes [DRINGEND] Spiele- und Multimedia-Programmierung 2
S Java3D - mehrere Instanzen eines Geometrieobjektes erzeugen Spiele- und Multimedia-Programmierung 3
ARadauer Grauwerte eines jpg ermitteln Spiele- und Multimedia-Programmierung 4
A Anzeigen eines Grapfen Spiele- und Multimedia-Programmierung 13
R Die korrekte Breite/Höhe eines Bildes wird nicht erkannt. Spiele- und Multimedia-Programmierung 2
S Problem bzgl. Umsetzung eines Rollenspiel Spiele- und Multimedia-Programmierung 6
M Ausschneiden eines Bereichs / Avatar Spiele- und Multimedia-Programmierung 2
G Ermitteln eines Punktes in einer anderen TransformGroup Spiele- und Multimedia-Programmierung 2
M Frage eines Anfängers Spiele- und Multimedia-Programmierung 3
DEvent [2D] Farbe bestimmten Pixels eines Bildes ändern Spiele- und Multimedia-Programmierung 3
V Wie berechnet man das Bild eines Schwarzen Loches in Java? Spiele- und Multimedia-Programmierung 10
G Breite eines Strings Spiele- und Multimedia-Programmierung 2
S Text an einer Seite eines Cubes Spiele- und Multimedia-Programmierung 7
F Image eines bestimmten Bereichs eines JPanels erstellen Spiele- und Multimedia-Programmierung 4
N Grafik als Hintergrund eines Rechtecks verwenden? Spiele- und Multimedia-Programmierung 4
N Rundenstrategiespiel - Problem beim Drehen eines Bildes Spiele- und Multimedia-Programmierung 18
F Brauche Hilfe bei Bewegung eines Rechtecks [Applet] Spiele- und Multimedia-Programmierung 5
T Java2D Spiel, beim Hinzufügen eines Bildes ruckelt das ganze Spiele- und Multimedia-Programmierung 3
F Position eines Objektes auslesen. Spiele- und Multimedia-Programmierung 7
W Rotation eines Objektes Spiele- und Multimedia-Programmierung 2
M Zerschneiden eines Bildes mit Wellenlinien? Spiele- und Multimedia-Programmierung 2
S Simulation in der Art eines Schachbrett Spiele- und Multimedia-Programmierung 2
A 2-Achsen Rotation eines Würfels Spiele- und Multimedia-Programmierung 4
L nicht sichtbare Kanten eines Würfels Spiele- und Multimedia-Programmierung 2
K Video aus JavaFX Images generieren Spiele- und Multimedia-Programmierung 2
Bananabert Spiel Renderer Images und Strings Spiele- und Multimedia-Programmierung 4
J Images laden in static Methode Spiele- und Multimedia-Programmierung 8
F ressourcensparendes Anlegen von Images Spiele- und Multimedia-Programmierung 3
Gossi Probleme beim Laden der Images aus dem "Tutorial für Java-Spiele" Spiele- und Multimedia-Programmierung 4
M Suche Schach Images Spiele- und Multimedia-Programmierung 5
radiac Netbeans Build Project... keine Images dabei??? Spiele- und Multimedia-Programmierung 9
E Tetris mit Images anstatt gezeichneten Rechtecken Spiele- und Multimedia-Programmierung 4
M Images/Sounds für Spiele Spiele- und Multimedia-Programmierung 3
D collision mit images und pixelgrabber Spiele- und Multimedia-Programmierung 12
S Images verzerren Spiele- und Multimedia-Programmierung 2
S Einzelpunkte bei Images Spiele- und Multimedia-Programmierung 2
C Images kolorieren und einfaden Spiele- und Multimedia-Programmierung 3

Ähnliche Java Themen

Neue Themen


Oben