Performance Problem bei BufferedImage

MaZeFrJoTh

Mitglied
Hallo liebe Leute ich habe nun mein erstes 2D Spiel fast fertig. Dies läuft soweit sehr flüssig, jedoch ist meine Prozessorauslastung bei 80% und bei alten PCs braucht es 40sec bis der Hintergrund aufgebaut wird. Ich verwende bisher png und für den Hintergrund jpg. Diese werden dann als BuffererdImage gespeichert und über die paintComponent Methode gezeichnet. Liegt dieser krasse Performance Unterschied daran, dass die alten PCs vllt nicht die neuste Java Version haben und somit auch keine Hardwarebeschleunigung. Ich zeig euch mal meine Methoden die ich benötige, um die Bilder zeichnen zu können:

Java:
private BufferedImage[] LadeBilder(String Pfad, int Bilder){        
            BufferedImage[] animation = new BufferedImage[Bilder];
            BufferedImage source = null;        
            URL Hole_url = getClass().getClassLoader().getResource(Pfad);
            try {
                source = ImageIO.read(Hole_url);
            }
            catch (IOException e){}        
            for(int i = 0;i < Bilder;i++){
                animation[i] = source.getSubimage(i*source.getWidth()/Bilder, 0, source.getWidth()/Bilder, source.getHeight());
            }           
            return animation;
        }

und:

Java:
 public void paintComponent(Graphics g){ 
            super.paintComponent(g);
            g.drawImage(Hintergrund, 0, 0, this);
            g.drawImage(Korb, o, 710,this);
            for(int i = 1; i <= 43; i++){
                g.drawImage(Apfel, koords[i].x, koords[i].y, this);
            }
            g.setColor(Color.red);
            g.setFont(new Font("Arial", Font.PLAIN, 30));
            g.drawString("Punkte: " + Long.toString(punkte), 530, 35);
            g.drawString("Zeit: " + Long.toString(30 - timer.Zeit()), 15, 35);
        }

Und ist BufferedImage hier schon angebracht oder wäre hier ManagedImage oder VolatileImage die bessere Wahl?

Danke an alle die mir helfen können.
 

Kr0e

Gesperrter Benutzer
Also solang du die Bilder nur EINMAL lädst (Und das tust du ja hoffentlcih ;)) und dann einfahc nur die referenzen zeichnest, sollte es da überhaupt kein Problem geben...

Vlt mal einen Profiler drüber laufen lassen. Bei Netbeans bereits integriert ;)
 

MaZeFrJoTh

Mitglied
Ich glaub schon, dass ich das Bild nur einmal Lade aber das geht auch SEEHR langsam. Und was heist nur die Referenzen zeichnen. Das Programm Netbeans ist mir auch nicht bekannt.
 

Kr0e

Gesperrter Benutzer
Also Netbeans ist ne IDE so wie Eclipse, die manchen arbeiten damit lieber, ich hingegen mit Netbeans^^ Ist Geschmacksache. Aber ich weiß halt, dass bei Netbeans ein Profiler drin ist, keine Ahnung ob das bei Eclipe auch der Fall ist, denke aber mal schon....

Mit "Referenzen zeichnen" hab ich mich vlt doof ausgedrückt, was ich meine ist:

Du lädst alle Bilder/Resourcen am Anfang des Programms und hinterher zeichnest du diese bereits geladenen Bilder... Also nicht, dass die bilder hinterher in jedem Durchgang neugeladen werden...
 

Apo

Bekanntes Mitglied
Gleiches Problem hatte ich ja auch siehe da und was mir davon vor allem geholfen hat war das

Ich habe mir geholfen indem ich ein neues Bild erstellt habe und das geladene einfach reingemalt habe. Hat bei mir sehr viel gebracht. Natürlich musst du auch drauf achten was Kr0e gesagt hat.

Java:
private static BufferedImage getImage(BufferedImage iOriginal, boolean transparent) {
	int type = iOriginal.getType();
	if (transparent) {
		type = BufferedImage.TYPE_INT_ARGB_PRE;
	} else {
		type = BufferedImage.TYPE_INT_RGB;				
	}
	BufferedImage iNew;
	try {
		iNew = new BufferedImage(iOriginal.getWidth(), iOriginal.getHeight(), type);
	} catch (Exception ex) {
		iNew = new BufferedImage(iOriginal.getWidth(), iOriginal.getHeight(), BufferedImage.TYPE_INT_RGB);
	}
	if (iNew != null) {
		Graphics2D g = iNew.createGraphics();
		g.drawImage(iOriginal, 0, 0, null);
		g.dispose();
	}
	return iNew;
}
 
Zuletzt bearbeitet:

Kr0e

Gesperrter Benutzer
@Apo:

Das Problem hatte ich auch mal, als ich Swing auf ein BufferedImage gezeichnet hab. Hab mich immer gewundert, wo der enorme Performanceverlust herkommt. Falsche Buffertypen können einem da ganz schön ins Handwerk fuschen... Guter Hinweis!
 

twseitex

Mitglied
Hallo, ein Auszug aus meinem Java-Audioplayer auf audio, flash and java

Die Kommentare sind wichtig.

Java SE ist ein unglaublicher Ressourcenfresser, wenn CPU zu schwach
und zu wenig RAM.



Cu.


// +++++ Bildfläche erzeugen und füllen mit Bilddaten aus Datei ++++++++++++++
// BufferedImage Bilddatei laden und puffern per ImageIO aus Url
// ohne Mediatracker
// ohne internen Cache
// Warnung: Sollen die Hilfroutinen zeitkritisch in paint()
// verwendet werden, dann den Quellcode der
// Routinen direkt einbauen in den zeitkritischen
// Programmteil, weil dann enorm an Laufzeit gespart
// wird. Bei Rekursionen möglichst globale Variablen
// und Rekursion sperren wenn gerade aktiv ist.
// Puffer kann benutzt werden um Bildfolge als Ersatz für
// animiertes GIF zu benutzen, da Java animierte
// GIF nicht rendern kann, dafür aber die GIF-
// Einzelbild-Folge.
// Datenpuffer existiert unabhängig vom Bildobjekt (Image).
// liegt im Hauptspeicher und ist also kein
// Stream (Streams sind nicht als Zeiger
// speicherbar)
// ImageIO liefert BufferedImage, das Teilbilder erzeugen kann
// benutzt keinen internen Cache
// Will man den internen Cache von Java nutzen, so muss man
// Toolkit.getDefaultToolkit().getImage(urlUrl);
// benutzten, das aber Image liefert.
// Image kennt keine Teilbilder.
// BufferedImage ist nicht nach Image castbar.
// Mediatracker verlangt ein Image und kann somit mit BufferedImage
// nicht umgehen, da nicht castbar auf Image.
// Java ist darin komplett inkompatibel.
// BufferedImage erzeugen mit Bilddimension laut Bilddatei

// ----- Fläche als gefülltes Image liefern
// Warnung: Sollen die Hilfroutinen zeitkritisch in paint()
// verwendet werden, dann den Quellcode der
// Routinen direkt einbauen in den zeitkritischen
// Programmteil, weil dann enorm an Laufzeit gespart
// wird. Bei Rekursionen möglichst globale Variablen
// und Rekursion sperren wenn gerade aktiv ist.
// sämtliche Dateien liegen im aktuellen Pfad
public static BufferedImage GUI2DDiversF06db(String X00)
// ruft auf AudioDivers.AudioDiversF13d()
// baut erst den aktuelle Pfad ein
// (denn dadurch kann Dateiname url-tauglich werden)
// und konvertiert dann
// X00 Dateiname ohne Pfad, wenn null oder Leerkette so kein laden
// liefert null wenn nicht gepuffert
{
// X01 und X02 frei
BufferedImage X03=null;
BufferedInputStream X04=null;

stGUI2DDiversV12cd=" GUI2DDiversF06db() ";

// +++++ Dateiname prüfen
if(X00!=null)
{
if(!X00.equals(""))
{
// +++++ gepufferten Inputstream der Datei im aktuellen Pfad liefern
X04=AudioDivers.AudioDiversF15d(X00,"",AudioDivers.intAudioDiversV01g,0);
// X00 Dateiname ohne Pfad
// X01 Pfad
// wenn null oder "" so den Pfad laut Dateilage ermitteln
// ansonsten als Pfadangabe verwenden
// wenn aber X00 bereits schema-tauglich ist, so X01 nicht verwenden
// darf nicht FILe-Schema enthalten
// X02 NUR laut Konstanten
// DateiPfad_Kategorie AppletIntern intAudioDiversV01e
// DateiPfad Kategorie Audio intAudioDiversV01f
// DateiPfad Kategorie Bilder intAudioDiversV01g
// X03 -2 so Nicht-File-Schema löschen
// -1 so File-Schema löschen
// 0 so nichts löschen
// 1 so jedes Schema löschen
// liefert unpufferten Input des Datenstromes per URL- bzw. Filesystem
// null wenn nicht erzeugbar
// Der Stream ist offen und somit nicht im Zeigerfeld speicherbar !
if(X04!=null)
{
// +++++ ImageIO.read() benutzten
// interner Cache nicht nutzbar
// Mediatracker nicht nutzbar
try
{X03=ImageIO.read(X04);
// ImageIO.read() erzeugt immer BufferedImage-Zeiger
// (also impliziertes new(), wobei damit alle
// Parameter des new BufferedImage() nicht
// einstellbar sind: Es wird automatisch bestimmt,
// wie die Bilddaten verarbeitet werden.
// Transparenz muss Teil des Bildes sein.
// Da das Bild geladen wird, ist Transparenz Teil des Bildes.
// File als Quelle bei Applet nicht möglich, da das im Browser
// im HTML-Fenster läuft, das nur URL kennt und kein
/ lokales Dateisystem, also kein File.
// ImageIO.read() benutzt ImageReader
}
catch(IOException e1)
{X03=null;
stGUI2DDiversV12cd+=" 4";
}
catch(IllegalArgumentException e2)
{X03=null;
stGUI2DDiversV12cd+=" 3";
}

// ----- BufferedInputStream schliessen
try
{X04.close();}
catch (IOException e3)
{
// nichts
}
}
else{stGUI2DDiversV12cd+=" 2";}

// Mediatracker geht nicht mit BufferedImage !!!!

// if(boFlag)
// {
// if(boMediaTrackerAktivieren)
// {
// if(mediaTrackerPuffern!=null)
// {
// // ++++ Tracker wird benutzt
// this.boBild_TrackerBenutzt=true;

// // ++++ nächste Gruppe (aus 1 Bild)
// intPuffern_MediaTrackerID_Aktuell++;

// // ++++ Bild an Tracker übergben
// mediaTrackerPuffern.addImage(X04Puffer,
// intPuffern_MediaTrackerID_Aktuell
// );
// // ++++ Tracken starten
// try
// {mediaTrackerPuffern.waitForID(intPuffern_MediaTrackerID_Aktuell);}
// catch (InterruptedException e)
// {
// boFlag=false;
// }

// // +++++ Status ermitteln
// if(boFlag)
// {

// boFlag=( ( mediaTrackerPuffern.statusAll(false)
// & MediaTracker.ERRORED
// )
// != 0
// ); // false so Fehler nicht vorhanden
// boFlag=!boFlag; // true so Fehler nicht vorhanden

// boFlag=( ( mediaTrackerPuffern.statusAll(false)
// & MediaTracker.COMPLETE
// )
// != 0
// ); // true so complete erkannt
// }

// // +++++ Trackstatus merken
// this.boBild_TrackerStatus=boFlag;
// }
// }
// }
} // Dateiame nicht leer
else{stGUI2DDiversV12cd+=" 1";}
} // Dateiname != null
else{stGUI2DDiversV12cd+=" 0";}

if(stGUI2DDiversV12cd.equals(""))
{if(X03==null)
{stGUI2DDiversV12cd+=" 5";}
}

return X03;
}
 

MaZeFrJoTh

Mitglied
Ok danke für die umfangreiche Antwort, hab jetzt beim überfliegen noch nicht alles kapiert aber das sieht ja aus, als hätte einer wirklich viel Ahnung von BufferedImages. Danke nochmal.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
egrath Vista OpenGL Performance Problem? Spiele- und Multimedia-Programmierung 3
N Performance Problem bei mit Graphics Spiele- und Multimedia-Programmierung 6
K VideoPlayer: Xuggler seekkeyframe extrem schlechte Performance.. Spiele- und Multimedia-Programmierung 3
pcfreak9000 "Allgemeine" Performance verbessern (LWJGL 2) Spiele- und Multimedia-Programmierung 2
turing OpenGL / Jogle Code Reveiw zur Performance Verbesserung Spiele- und Multimedia-Programmierung 1
F Massive FPS-Schwankungen, schlechte Performance Spiele- und Multimedia-Programmierung 3
J Java Game performance Probleme Spiele- und Multimedia-Programmierung 7
R LWJGL: Performance glBegin, drawList, ... Spiele- und Multimedia-Programmierung 16
K Android: OpenGL render performance Tipps ? Spiele- und Multimedia-Programmierung 4
B Performance Spiele- und Multimedia-Programmierung 19
Grejak Performance Spiele- und Multimedia-Programmierung 5
M Performance von BufferedImages Spiele- und Multimedia-Programmierung 15
M Pixel eines BufferedImage bearbeiten (Performance) Spiele- und Multimedia-Programmierung 23
A jogl 2d performance Spiele- und Multimedia-Programmierung 20
P int-Array zu BufferedImage (performance?) Spiele- und Multimedia-Programmierung 14
S Graphics2D Oval vs. Rect -Performance Spiele- und Multimedia-Programmierung 17
Taschenschieber Schachbrett mit SVG/Batik: Performance? Spiele- und Multimedia-Programmierung 3
Tapsi Anfänger braucht einen Rat ^^ --> Performance Spiele- und Multimedia-Programmierung 7
T performance Spiele- und Multimedia-Programmierung 10
I RPG-Spiel und Performance Spiele- und Multimedia-Programmierung 33
M Spiel Performance erhöhen Spiele- und Multimedia-Programmierung 24
M Performance Spiele- und Multimedia-Programmierung 5
S [Java2D] Performance Frage Spiele- und Multimedia-Programmierung 4
H Performance check Pong Spiele- und Multimedia-Programmierung 19
M Space PingPong Game --> Performance ok? Spiele- und Multimedia-Programmierung 44
J Performance Spiele- und Multimedia-Programmierung 6
P Java3D Performance und Abstürze Spiele- und Multimedia-Programmierung 3
K Performance von J3D Spiele- und Multimedia-Programmierung 5
A [HILFE] - Minecraft-Problem! Spiele- und Multimedia-Programmierung 1
C Plugin Problem Spiele- und Multimedia-Programmierung 2
J JLayer Problem Spiele- und Multimedia-Programmierung 1
Meeresgott LWJGL 3 Problem mit einer Texture Spiele- und Multimedia-Programmierung 4
G Low Poly 3D LWJGL Shader Problem Spiele- und Multimedia-Programmierung 4
O Problem beim Aufrufen des Spiels von einem Menü Spiele- und Multimedia-Programmierung 7
G LIBGDX Texturen Problem Spiele- und Multimedia-Programmierung 1
G LIBGDX Problem beim resizen des Frames Spiele- und Multimedia-Programmierung 3
C AutoClicker Problem Spiele- und Multimedia-Programmierung 2
S OOP Logik Problem Spiele- und Multimedia-Programmierung 5
G LIBGDX Viewport Problem Spiele- und Multimedia-Programmierung 3
J Problem mit Game Of Life Spiele- und Multimedia-Programmierung 3
N Problem mit 2D Spiel Spiele- und Multimedia-Programmierung 17
C Minecraft Minecraft Plugin Problem Spiele- und Multimedia-Programmierung 17
R Pong Spiel Problem Spiele- und Multimedia-Programmierung 1
V Problem mit BufferStrategy Spiele- und Multimedia-Programmierung 2
Streeber Problem mit Transparenz/TextDrawing in LWJGL/Slick2d (OpenGL) Spiele- und Multimedia-Programmierung 1
E A-Stern Algorithmus Problem und Implementierung einer Map Spiele- und Multimedia-Programmierung 6
T LWJGL 2.9.2: Seltsamer Effekt beim Rendern (VertexShader Problem?) Spiele- und Multimedia-Programmierung 3
W Generelles Problem: Entscheidungsfindung Spiele- und Multimedia-Programmierung 4
T Problem bei Kollisionsabfrage Spiele- und Multimedia-Programmierung 4
C Vier Gewinnt Problem mit Ordnerstruktur Spiele- und Multimedia-Programmierung 2
T Problem mit Eclipse (java)-(minecraft) Spiele- und Multimedia-Programmierung 3
I Textbasiertes Spiel - Umsetzungsfrage & Schleifen Problem Spiele- und Multimedia-Programmierung 26
M Sound Problem Spiele- und Multimedia-Programmierung 3
T Problem beim Aufbau des Spielfelds Spiele- und Multimedia-Programmierung 18
M Sound Engin Problem 2 Spiele- und Multimedia-Programmierung 2
J Problem bei der GUI - Zu viele Spielbretter Spiele- und Multimedia-Programmierung 2
D LWJGL gluLookAt "Umschauen" Problem Spiele- und Multimedia-Programmierung 0
D Problem mit Würfelanimierung in LWJGL Spiele- und Multimedia-Programmierung 7
C Zeldaklon Problem mit Wand-Kollision Spiele- und Multimedia-Programmierung 8
0 Boxen übereinander stapelt Problem Spiele- und Multimedia-Programmierung 5
D Textfield im Game ,Problem: while-Schleife Spiele- und Multimedia-Programmierung 3
R 2D platformer - enemy damage -> TIMER PROBLEM Spiele- und Multimedia-Programmierung 3
S LWJGL Kamera Problem - Alles verzerrt Spiele- und Multimedia-Programmierung 4
B LWJGL StackOverFlow Problem nach 30sekunden. (Pong) Spiele- und Multimedia-Programmierung 2
Seikuassi LWJGL-Problem Spiele- und Multimedia-Programmierung 2
L Minecraft Minecraft Plugin programmieren (Craftbukkit 1.7.2) Problem Spiele- und Multimedia-Programmierung 4
B Minecraft mehr Ram zuweißen Problem Spiele- und Multimedia-Programmierung 0
K Bukkit Plugin Problem Spiele- und Multimedia-Programmierung 3
Y Problem mit repaint() in run() Spiele- und Multimedia-Programmierung 2
X Kleines Problem mit Java Reflections und einem eigenen Eventhandler Spiele- und Multimedia-Programmierung 1
T Problem mit Kollisionsabfrage der NPC Spiele- und Multimedia-Programmierung 1
J Minecraft Problem mit dem JRE - Minecraft Spiele- und Multimedia-Programmierung 3
TheSorm Problem mit 2 classen NullPointerException Spiele- und Multimedia-Programmierung 1
S Problem mit 4 gewinnt(MinMax Algorithmus) Spiele- und Multimedia-Programmierung 2
N Problem in der Main.class Spiele- und Multimedia-Programmierung 1
J Blöcke, Hitboxen, Koolisionsabfrage - Problem Spiele- und Multimedia-Programmierung 8
S Problem mit 3d-Polygon Spiele- und Multimedia-Programmierung 2
A Problem mit Sound Spiele- und Multimedia-Programmierung 5
C Nxt Duell Problem Spiele- und Multimedia-Programmierung 4
F LWJGL Problem mit Erstellen eines Objekts und der Kamera Spiele- und Multimedia-Programmierung 5
ruerob Problem bei Fade-Out von Sounds Spiele- und Multimedia-Programmierung 3
L [Slick2D] Problem bei Speicherfreigabe Spiele- und Multimedia-Programmierung 2
M Bukkit Plugin Problem Spiele- und Multimedia-Programmierung 22
T Java3D Rendering Problem Spiele- und Multimedia-Programmierung 7
J Problem bei pixelgenauer Kollisionsabfrage Spiele- und Multimedia-Programmierung 10
F Problem mit dem Abspielen von byte[] (Audioprogrammierung) Spiele- und Multimedia-Programmierung 2
C Problem mit Abspielen von Audio-Dateien Spiele- und Multimedia-Programmierung 3
R Problem bei Farbe ändern/4Gewinnt Spiele- und Multimedia-Programmierung 5
R StringIndexOutOfBoundsException - Problem Spiele- und Multimedia-Programmierung 2
S Problem mit Sichtfeld/Licht in einem Raster Spiele- und Multimedia-Programmierung 5
G Acht-Damen-Problem HILFE! Spiele- und Multimedia-Programmierung 11
A TileMap KeyListener - Problem Spiele- und Multimedia-Programmierung 2
J Problem mit Threads Spiele- und Multimedia-Programmierung 8
N Problem mit Kollisionsabfrage beim Fallen Jump & Run Spiele- und Multimedia-Programmierung 5
S Problem mit Zeitsteuerung der Game Loop Spiele- und Multimedia-Programmierung 4
Fu3L Problem mit 3D Noise Spiele- und Multimedia-Programmierung 4
L Problem beim Rätsellöser Spiele- und Multimedia-Programmierung 3
D Problem beim bewegen einer Figur Spiele- und Multimedia-Programmierung 2
T Problem bei LinkedList / JPanel Spiele- und Multimedia-Programmierung 4
T Problem mit ClassLoader und LWJGL Spiele- und Multimedia-Programmierung 5

Ähnliche Java Themen

Neue Themen


Oben