Optimierung vom Laden von Grafiken

Status
Nicht offen für weitere Antworten.

Sanix

Top Contributor
Hallo, ich habe dieses SpaceInvaders Tutorial gemacht. Dort wird der Bildladeprozess optimiert, in dem man zuerst native Einstellungen dazu verwendet (irgendwie so habe ich es verstanden).

Vorher
Code:
public class SpriteCache extends ResourceCache{
	
	protected Object loadResource(URL url) {
		try {
			return ImageIO.read(url);
		} catch (Exception e) {
			System.out.println("No se pudo cargar la imagen de "+url);
			System.out.println("El error fue : "+e.getClass().getName()+" "+e.getMessage());
			System.exit(0);
			return null;
		}
	}
	
	public BufferedImage getSprite(String name) {
		return (BufferedImage)getResource(name);
	}
}

public abstract class ResourceCache
{
	protected HashMap<String, Object> resources;
	
	public ResourceCache()
	{
		resources = new HashMap<String, Object>();
	}
	
	/**
	 * Loads a resource from the classpath
	 * 
	 * @param name
	 * @return
	 */
	protected Object loadResource(String name)
	{
		URL url = null;
		url = getClass().getClassLoader().getResource(name);
		
		return loadResource(url);
	}
	/**
	 * 
	 * @param name
	 * @return Resource as Object
	 */
	protected Object getResource(String name)
	{
		Object res = resources.get(name);
		//Check if object has been loaded
		if(res == null)
		{
			res = loadResource("res/" + name);
			resources.put(name, res);
		}
		return res;
	}
	
	protected abstract Object loadResource(URL url);
}

Nachher
Code:
public class SpriteCache extends ResourceCache implements ImageObserver
{
	BufferedImage compatible;
	
	protected Object loadResource(URL url) {
		try {
			return ImageIO.read(url);
		} catch (Exception e) {
			System.out.println("No se pudo cargar la imagen de "+url);
			System.out.println("El error fue : "+e.getClass().getName()+" "+e.getMessage());
			System.exit(0);
			return null;
		}
	}
	
	public BufferedImage createCompatible(int width, int height, int transparency) {
		GraphicsConfiguration gc = 
		  GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration();
		BufferedImage compatible = gc.createCompatibleImage(width,height,transparency);
		return compatible;
	}
	
	public BufferedImage getSprite(String name) {
		BufferedImage loaded = (BufferedImage)getResource(name);
		if(compatible == null)
		{
			compatible = createCompatible(loaded.getWidth(),loaded.getHeight(),Transparency.BITMASK); 
		}
		Graphics g = compatible.getGraphics();
		g.drawImage(loaded,0,0,this);
		
		return compatible;
	}
		
  public boolean imageUpdate(Image img, int infoflags,int x, int y, int w, int h) {
	   return (infoflags & (ALLBITS|ABORT)) == 0;
  }
}

public abstract class ResourceCache {
	protected HashMap resources;
	
	public ResourceCache() {
	  resources = new HashMap();
	}
	
	protected Object loadResource(String name) {
		URL url=null;
		url = getClass().getClassLoader().getResource(name);
		return loadResource(url);
	}
	
	protected Object getResource(String name) {
		Object res = resources.get(name);
		if (res == null) {
			res = loadResource("res/"+name);
			resources.put(name,res);
		}
		return res;
	}
	
	protected abstract Object loadResource(URL url);

}

Nun ist das ganze jedoch nicht schneller, sondern beginnt stark zu ruckeln. Woran liegt das?


Eine weitere Frage:
Was ist performanter? Entweder man zeichnet immer alles auf einem Canvas Objekt, oder man verwendet Komponenten, die man dann bewegt? Wahrscheinlich wird beides dasselbe sein, oder nicht? Weil Java muss ja dann auch alles neu zeichnen, wenn man Komponenten verwendet.
 

AlArenal

Top Contributor
Nein, aber: "Optimierung des Ladens von Grafiken"

Wir wollen doch nicht, dass Bastian Sick uns in seiner Kolumne verwurstet, oder?
 

kleiner_held

Top Contributor
so soll es wahrscheinlich sein:
Code:
  public BufferedImage getSprite(String name) {
      if(compatible == null)
      {
         BufferedImage loaded = (BufferedImage)getResource(name);
         compatible = createCompatible(loaded.getWidth(),loaded.getHeight(),Transparency.BITMASK);
         Graphics g = compatible.getGraphics();
         g.drawImage(loaded,0,0,this);
      }
      return compatible;
   }

so wie du es hast, zeichnest du bei jedem Aufruf von getSprite(String ) das geladene Image in dein kompatibles BufferedImage - das kann ja wohl nicht der Sinn sein.
 

Sanix

Top Contributor
AlArenal hat gesagt.:
Nein, aber: "Optimierung des Ladens von Grafiken"

Wir wollen doch nicht, dass Bastian Sick uns in seiner Kolumne verwurstet, oder?

Der Dativ ersetzt den Genitiv. Ich denke schon, dass man dies so schreiben kann. Aber als Schweizer ist das immer heikel ;). Btw. müsstest du nicht "oder" sondern "ne" verwenden :p.



@KleinerHeld
Danke für deine Hilfe, ich probiere es Mal aus.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Optimierung einer Methode (byte-Geraffel) Allgemeine Java-Themen 2
L Best Practice Auslagerung von Code = Performance Optimierung? Allgemeine Java-Themen 4
F Zeit Optimierung - bzw. ms Optimierung Allgemeine Java-Themen 35
R Optimierung beim Vergleichen von 2 Bildern Allgemeine Java-Themen 23
HarleyDavidson Regex - Optimierung Allgemeine Java-Themen 4
K Optimierung kürzester Weg im Warenlager Allgemeine Java-Themen 8
O Algorithmus Optimierung Allgemeine Java-Themen 3
H Optimierung durch Threads Allgemeine Java-Themen 31
C Programmflow-Optimierung Allgemeine Java-Themen 7
G Klasse Optimierung Allgemeine Java-Themen 6
N Optimierung einer Berechnung Allgemeine Java-Themen 17
S jdk versus openjdk - Optimierung von Konstanten? Allgemeine Java-Themen 8
P Optimierung (&& ||) deaktivieren / umgehen? Allgemeine Java-Themen 9
G Optimierung StringBuilder Allgemeine Java-Themen 9
S Brainstorming --> Optimierung vonn Gefälleplatten Allgemeine Java-Themen 8
D Optimierung beim Casten Allgemeine Java-Themen 4
O Maven ein externes jar laden ohne die Applikation neu zu kompilieren Allgemeine Java-Themen 4
F Laden von bestimmten Daten aus TAR Archiv Allgemeine Java-Themen 23
E Objekte in einen String packen und wieder laden Allgemeine Java-Themen 5
Tobero .jar Dateine aus einem Ordner laden (Java 16) Allgemeine Java-Themen 5
yakazuqi Fehler beim Laden. JDA (Java Discord API) Allgemeine Java-Themen 1
L Jar Dateien in Classpath laden ab JDK 9+ Allgemeine Java-Themen 11
C Wav-Datei aus Jar laden? Allgemeine Java-Themen 11
H Objekte speichern und laden Allgemeine Java-Themen 10
H Objekte speichern und laden Allgemeine Java-Themen 1
H Objekt speichern und laden Allgemeine Java-Themen 1
H Objekt speichern und laden Allgemeine Java-Themen 1
I Klassen aus Jar-Dateien aus anderem Ordner laden Allgemeine Java-Themen 3
F Arraylist vollständig abspeichern und laden Allgemeine Java-Themen 1
T Compiler-Fehler NoClassDefFoundError beim Laden einer Class Allgemeine Java-Themen 11
temi Java Programm aus einer DB laden und starten Allgemeine Java-Themen 2
I Laden von Informationen aus Dateien: Austauschbarkeit: 2 Dateien sinnvoll? Allgemeine Java-Themen 2
H Laden einer (Resourcendatei) aus einem Jar-File Allgemeine Java-Themen 17
B Von String zu <Objekt> ||Speichern/Laden Allgemeine Java-Themen 17
Developer_X Website HTML Code von HTTPS URL laden Allgemeine Java-Themen 0
L Seite einer Partner Website neu laden Allgemeine Java-Themen 1
RalleYTN Audiolänge einer MP3 Datei erhalten ohne diese vollständig zu laden Allgemeine Java-Themen 15
S Maven Jars dynamisch laden / Plugin-Struktur erstellen Allgemeine Java-Themen 14
X Klassen aus jar in jar Laden Allgemeine Java-Themen 1
X Mehrere booleans in Datei Speichern, Updaten und Laden Allgemeine Java-Themen 1
L Mapdaten laden Allgemeine Java-Themen 10
B Aktuellen Sourcecode aus Browser laden Allgemeine Java-Themen 43
HoloYoitsu Kann .dll nur aus Eclipse heraus laden Allgemeine Java-Themen 7
F Teil eines Bildes laden Allgemeine Java-Themen 1
L JavaFX JavafX externe FXML laden? Allgemeine Java-Themen 4
M Eine Datei im Speicher erneut laden(?) Allgemeine Java-Themen 1
D JAVA Basiertes Spiel aus dem Internet in eigenem Client laden Allgemeine Java-Themen 3
S Allgemeine parallelisierte Loesung um Daten im Hintergrund zu laden..? Allgemeine Java-Themen 6
F Java Native/Shared Library (.so) laden macht Probleme Allgemeine Java-Themen 3
V Input/Output Sound Dateien aus Jar laden Allgemeine Java-Themen 18
V Input/Output Gif Bilder Animiert aus einer Jar laden Allgemeine Java-Themen 4
V Input/Output Swing Icons in Jar Archiv laden Allgemeine Java-Themen 10
C BufferedImages in Jar laden. Allgemeine Java-Themen 1
G StackoverflowError beim laden einer FXMML Datei Allgemeine Java-Themen 1
Developer_X Input/Output Serialisiertes Objekt speichern und laden Allgemeine Java-Themen 1
J Arraylist speichern und laden? Allgemeine Java-Themen 5
S Applet in html laden; InvocationTargetException,.. nur warum ? Allgemeine Java-Themen 0
M Klassen Klasse Dynamisch laden und Konstruktor aufrufen Allgemeine Java-Themen 1
A Anderes Fenster neu laden Allgemeine Java-Themen 16
N Daten aus Jar laden Allgemeine Java-Themen 10
N Klasse via ClassLoader laden Allgemeine Java-Themen 2
antonbracke Aus Jar eine Class laden und damit arbeiten! Allgemeine Java-Themen 5
K Input/Output Daten speichern / laden Allgemeine Java-Themen 2
A Class Datei aus Verzeichnis über URLClassLoader laden Allgemeine Java-Themen 2
A mit getClassLoader Bild laden Allgemeine Java-Themen 8
S Speichern/Laden/Hinzufügen/Löschen der Array-Wörter; unerwartete Ausgabe Allgemeine Java-Themen 6
G Native Library / Fehler beim Laden der .so/.dll Datei Allgemeine Java-Themen 17
antonbracke Klassen Klassen gegenseitig laden Allgemeine Java-Themen 4
K Input/Output Im Programm instanzierte Objekte Speichern und laden Allgemeine Java-Themen 3
T Java Klassen aus externer .jar laden und ausführen Allgemeine Java-Themen 3
P Textdatei aus Ressourcen laden. Allgemeine Java-Themen 8
R Java Array speichern & laden Allgemeine Java-Themen 23
N Input/Output Bild von WebSite laden? Allgemeine Java-Themen 3
G Interface Laden der Konfiguration über Interfaces sinnvoll? Allgemeine Java-Themen 28
Z Bilder aus JAR laden Allgemeine Java-Themen 2
D Ressourcen(config) laden Allgemeine Java-Themen 11
J Laden von JAR Files geht ohne ADMIN Rechte sehr langsam Allgemeine Java-Themen 6
S IMAGE ARRAY laden Allgemeine Java-Themen 6
J Methoden Fehler beim serialisieren und laden!? help Allgemeine Java-Themen 4
Grejak 2D-Grafik Resourcen laden Allgemeine Java-Themen 4
firefexx ResourceBundle laden Allgemeine Java-Themen 2
V Klassen in "abgeschirmten Bereich" laden? Allgemeine Java-Themen 7
I bibliotheken nur via kommandozeile laden Allgemeine Java-Themen 16
U Classpath DLLs mittels System.load() laden: Allgemeine Java-Themen 6
F Vierdimensionellen String Array speichern/laden Allgemeine Java-Themen 5
T Api in Quellcode laden Allgemeine Java-Themen 8
O Jar und Iconbild laden Allgemeine Java-Themen 19
A Problem mit Bilder laden mit sum.kern Allgemeine Java-Themen 9
F Laden von externen Bibliotheken Allgemeine Java-Themen 3
hdi Ressourcen dynamisch zur Laufzeit laden Allgemeine Java-Themen 15
P Laden von Dateien mit und ohne JavaWebStart Allgemeine Java-Themen 3
I HTML Seite laden Allgemeine Java-Themen 6
A Klassen dynamisch aus jar-datei laden Allgemeine Java-Themen 5
D Bilder aus externer .jar laden Allgemeine Java-Themen 3
reibi Files über Classpath laden Allgemeine Java-Themen 22
S Dynamisches Manipulieren/Laden von Klassen Allgemeine Java-Themen 4
M Klasse aus xyz.class Datei laden / package entfernen? Allgemeine Java-Themen 4
multiholle Resourcen aus Jar-Archiv laden Allgemeine Java-Themen 5
F Bild aus externer Quelle laden und Skalieren? Allgemeine Java-Themen 11
hdi Kann Substance LAF nicht laden Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben