Geschwindigkeit bei Polygonen und BufferedImage

Status
Nicht offen für weitere Antworten.

TSlaughter

Mitglied
Hallo!

Ich habe ein Geschwindigkeitsproblem bei meinem Image.

Ich baue mir aus mehreren Polygonen ein Image zusammen

Code:
	public void printObject(Graphics2D g,ShapePolygon sp, boolean bs, int index, int modus)
	{
                    Area rgarea = getPrintObject(sp,bs);
	    if (rgarea!=null) printShape(g,rgarea,index,modus);	
	}

	public void printShape(Graphics2D g, Area a, int index, int modus)
	{
                    g.setStroke(...);
    	    
                     ...
                    g.fill(a);
	    g.setColor(...);
	    g.draw(a);		
	}
	public Area getPrintObject(ShapePolygon sp, boolean bs)
	//zeichnet ein ShapePolygon und gibt die dazugehörige Area zurück
	{	Area rgarea; //Rückgabearea
		boolean sichtbar = true;
		if (bs)
		{	
			Rectangle bildschirm = new Rectangle(...);
			sichtbar = bildschirm.intersects(sp.getRect());
		}
		else sichtbar = true;
		
		if ((at.getMin()!=0) && (sichtbar))
		{	
			sichtbar = ((...));
		}
		
		if (sichtbar)  //wenn Polygon sichtbar ist, wir rgarea erstellt
		{	
			double[] point = new double[2];
			int anzpkt = sp.getNumPoints();
			int[] x = new int[anzpkt];
			int[] y = new int[anzpkt];
			for (int i=0; i<anzpkt ;i++)
			{	point    = sp.getPoint(i);
                                                                // umrechnung in eine passende Zoomstufe
				x[i] = mainhandler.shapefunctions.Zoom((double)point[0]);
				y[i] = mainhandler.shapefunctions.Zoom((double)point[1]);
			}				
			rgarea = new Area(new Polygon(x,y,anzpkt));
		}	
		else rgarea = null;
		return rgarea;
	}

Die Funktion printObject(...)t wird für jedes ShapePolygon einzeln aufgerufen ( ca. 20000 mal )
Das Graphics2D kommt von einem BufferedImage.

Nun ist das ganze aber ziemlich langsam und benötigt bei mir etwa eine halbe Sekunde für ein komplettes Bild.
Gibt es da nicht etwas besseres wie z.B. mit einem MemoryImageSource/ Hashtable oder sonst etwas??? ( mal abgesehen das man bei dem Code hier noch etwas optimieren kann)

Danke

TSlaughter
 
G

Guest

Gast
Wenn das ganze 20000 mal durchläuft, dann würde ich an
Deiner Stelle auf das ständige erzeugen von Objekten,
unnötige Casts und Methodenaufrufe verzichten.

20000 Rectangle Objekte, nur um intersection-check durchzuführen.
Rectangle bildschirm = new Rectangle(...); // wiederverwenden statt neu erstellen

20000 unnötige Methodenaufrufe
if ((at.getMin()!=0) && (sichtbar)) // anders herum (sichtbar && at.getMin()!=0)

20000 Arrays erzeugt, die nicht verwendet werden
double[] point = new double[2]; // wozu new ... es wird doch paar Zeilen weite unten überschrieben

20000 * anzpkt * 2 unnötige double casts
x = mainhandler.shapefunctions.Zoom((double)point[0]);
y = mainhandler.shapefunctions.Zoom((double)point[1]);

20000 Area und Polygon-Objekte
rgarea = new Area(new Polygon(x,y,anzpkt));


Es wird bestimmt noch um einiges schneller, wenn Du die genannten Optimierungen
durchführst. Keine Optimierung macht aber Sinn, wenn man nicht vorher die
langsamsten Stellen des Codes ermittelt bzw. die zu optimierenden Code-Abschnitte
ermittelt.
 

TSlaughter

Mitglied
Moin

Danke für deine Antwort. Das ganze Probier ich gleich mal aus.

Am längsten bei der Geschichte dauert das g.fill(a), also das Zeichnen des Areas in das Bild.
Danach wesentlich schneller das g.draw(a).

Die beiden fressen am meisten Zeit.
 

TSlaughter

Mitglied
.... so hab jetzt die Änderungen reingebaut und das ganze läuft jetzt fast doppelt so schnell.
:D

die einzigen die das ganze jetzt noch ausbremsen sind g.fill(a) und g.draw(a)

aber wie ich das schneller machen soll weiß ich nicht.
Hast du eine Idee??

Tschü TSlaughter
 

TSlaughter

Mitglied
Mmmmmh.....

irgendwie bekomm ich das nicht hin.
Gibt es irgenwo ein gutes Tutorial dafür.

Google bringt mich auch nicht weiter

Slaughter
 

dronus

Mitglied
Auch beim BufferedImage kommt es extem auf die Sorte an (TYPE)

Oftmals muss man abwägen, ob man das Image "kompatibel" zum Bildschirm macht (z.B. vom Canvas erzeugen) dann geht das hinzeichnen schnell, oder "einfache Modi" (z.B. INTEGER) wählt, die schnell zeichnen, auch wenn es dann bei der Bildschirmdarstellung umgewandelt wird.
 

TSlaughter

Mitglied
ich benutze den Typ: TYPE_INT_ARGB

bei den anderen kommt es zu Darstellungsfehlern wenn ein Polygon mit Transparents gezeichnet wird.

MFG Torsten
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Input/Output Programm zum Auslesen/Beschreiben von Textdateien, wie Geschwindigkeit erhöhen? Allgemeine Java-Themen 18
T Geschwindigkeit beim Generieren erhöhen? Allgemeine Java-Themen 7
S Geschwindigkeit HashMap oder .getParent Allgemeine Java-Themen 5
byte JMockit - Geschwindigkeit Allgemeine Java-Themen 7
B Verzeichnis durchsuchen geschwindigkeit optimieren Allgemeine Java-Themen 6
R Parser: Datei auslesen, Datei erstellen - Geschwindigkeit Allgemeine Java-Themen 16
G java spiel (geschwindigkeit) Allgemeine Java-Themen 37
F Geschwindigkeit messen Allgemeine Java-Themen 7
E Geschwindigkeit static Allgemeine Java-Themen 6
O RXTX Geschwindigkeit? Codebeispiel dabei. Allgemeine Java-Themen 21
P Geschwindigkeit von Java GUIs Allgemeine Java-Themen 45
J Http/Https Geschwindigkeit Allgemeine Java-Themen 14
B java geschwindigkeit Allgemeine Java-Themen 16
O Geschwindigkeit Fortran und Java Allgemeine Java-Themen 11
J JCopy & Geschwindigkeit? Allgemeine Java-Themen 4
A Geschwindigkeit Java unter Linux Allgemeine Java-Themen 9
M Geschwindigkeit RXTX JAVA Allgemeine Java-Themen 3
N Performance-Test (Geschwindigkeit von Methoden vergleichen)? Allgemeine Java-Themen 4
P Geschwindigkeit und Genauigkeit bei Zeitmessung Allgemeine Java-Themen 13
R Geschwindigkeit herausfinden Allgemeine Java-Themen 2
D BufferedImage resize Allgemeine Java-Themen 16
RalleYTN JOGL Texture in BufferedImage konvertieren Allgemeine Java-Themen 1
M Input/Output BufferedImage vertauscht width und height Allgemeine Java-Themen 6
G BufferedImage und ByteArray Allgemeine Java-Themen 2
P Threads BufferedImage, Thread Concurrency Allgemeine Java-Themen 1
M Problem mit BufferedImage und PrinterJob im Querformat Allgemeine Java-Themen 1
T BufferedImage verändert sich beim Einlsesen Allgemeine Java-Themen 1
M BufferedImage toString() überschreiben Allgemeine Java-Themen 5
Thallius PDF von einem BufferedImage erstellen Allgemeine Java-Themen 1
S BufferedImage vergleich mit Subimage Allgemeine Java-Themen 1
reibi OutOfMemoryError bei Behandlung von BufferedImage's Allgemeine Java-Themen 6
TheSorm BufferedImage spiegeln Allgemeine Java-Themen 3
A BufferedImage einzelne Pixel transparent machen V2.0 Allgemeine Java-Themen 2
S Undoable BufferedImage? Allgemeine Java-Themen 2
lumo 2D-Grafik BufferedImage und operationen darauf Allgemeine Java-Themen 2
K Image zu BufferedImage konvertieren Allgemeine Java-Themen 9
H BufferedImage Invertieren Allgemeine Java-Themen 13
D md5 berechnen für BufferedImage Allgemeine Java-Themen 5
D BufferedImage rotieren Allgemeine Java-Themen 8
TiME-SPLiNTER Binary BufferedImage automatisch croppen Allgemeine Java-Themen 4
F byte[] aus einem BufferedImage Allgemeine Java-Themen 3
0 BufferedImage - Farbton verändern Allgemeine Java-Themen 5
J BufferedImage aus PNG Files haben keinen Type Allgemeine Java-Themen 4
T umwandeln BufferedImage to File Allgemeine Java-Themen 7
reibi BufferedImage nach InputStream Allgemeine Java-Themen 10
Q BufferedImage enzelne Pixel tranzparent machen Allgemeine Java-Themen 2
S BufferedImage mit Transparenten Hintergrund Allgemeine Java-Themen 4
Z Farbe des Pixels rechts unten in einem BufferedImage? Allgemeine Java-Themen 4
R problem! bufferedimage speichern. Allgemeine Java-Themen 7
S BufferedImage als *.tga speichern Allgemeine Java-Themen 3
H Pixel im BufferedImage Manipulieren ? Allgemeine Java-Themen 17
Steev BufferedImage und setRGB() Allgemeine Java-Themen 10
P miese performance bei nem BufferedImage + repaint :( Allgemeine Java-Themen 6
M Drucken mit BufferedImage Allgemeine Java-Themen 9
M Problem mit Durchsuchen von BufferedImage Allgemeine Java-Themen 10
I BufferedImage etc Allgemeine Java-Themen 6
F BufferedImage -> Image Allgemeine Java-Themen 4
G BufferedImage benutzen Allgemeine Java-Themen 6
U BufferedImage.getSubimage ? paintComponent ? Allgemeine Java-Themen 4
T Bilder schnell in BufferedImage laden Allgemeine Java-Themen 4
G BufferedImage zeichnen Allgemeine Java-Themen 4
T BufferedImage aus einem byte-Array? Allgemeine Java-Themen 2
T BufferedImage problem Allgemeine Java-Themen 6
K 32-Bit grayscale BufferedImage Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben