Guten Abend alle miteinander,
ich hab erst vor kurzem im Grafikprogrammierungsunterforum (was für ein Wort) ein Thema eröffnet, wo es darum ging ein Bild richtig zu drehen, dass es auch in der Größe passt. Das Thema ist durch, dann gings ans optimieren. Ich hab gemerkt, dass das ganze relativ langsam ist (jedenfalls zu langsam um es in einem Spiel für viele rotierende Objekte nutzen zu können) hab ich den Code abgeändert.
Jetzt bekomme ich ein 300x300 Pixel großes Bild in ca. 1.49071 ms gedreht. viel größer werden die Bilder später eh nicht sein, von daher ist das OK.
Ich hab in der Animation immer wieder kleine Ruckler gesehen, und weil ich keine Ahnung hatte (und immernoch nicht habe) wo die her kommen hab ich mal die Zeiten gemessen, die es braucht um das Bild zu drehen:
Hier der Code, der das Bild dreht. Am Ende wird noch die benötigte Zeit in Millisekunden ausgegeben.
Wird alle 20ms von einem Thread aufgerufen (nicht der EDT).
Die Zeiten hab ich aus der Konsole in ein Tabellendokument kopiert und mir die Werte mal genauer angeschaut.
Das Dokument findet ihr hier: Tabelle
Beachtet auch die anderen Sheets. Da findet man noch ein paar Diagramme die das ganze schöner veranschaulichen.
Kann mir vielleicht jemand verraten wo diese extremen Ausschläge herkommen? Immerhin liegen die gerade bei den kleineren Grafiken in einer mir nicht erklärbaren höhe.
Danke für eure Hilfe
Gruß Max
ich hab erst vor kurzem im Grafikprogrammierungsunterforum (was für ein Wort) ein Thema eröffnet, wo es darum ging ein Bild richtig zu drehen, dass es auch in der Größe passt. Das Thema ist durch, dann gings ans optimieren. Ich hab gemerkt, dass das ganze relativ langsam ist (jedenfalls zu langsam um es in einem Spiel für viele rotierende Objekte nutzen zu können) hab ich den Code abgeändert.
Jetzt bekomme ich ein 300x300 Pixel großes Bild in ca. 1.49071 ms gedreht. viel größer werden die Bilder später eh nicht sein, von daher ist das OK.
Ich hab in der Animation immer wieder kleine Ruckler gesehen, und weil ich keine Ahnung hatte (und immernoch nicht habe) wo die her kommen hab ich mal die Zeiten gemessen, die es braucht um das Bild zu drehen:
Java:
public Image getImage() {
long t = System.nanoTime();
BufferedImage img = (BufferedImage) icon.getImage();
//First calculate the new ImageSize
int size = (int) Math.sqrt( Math.pow(img.getWidth(), 2) + Math.pow(img.getHeight(), 2));
//create a new (empty) Image to hold the finished rotated Image.
BufferedImage rotatedImage = new BufferedImage(
size,
size,
BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = (Graphics2D) rotatedImage.getGraphics();
g2d.setColor(Color.BLACK);
g2d.drawRect(0, 0, size-1, size-1);
int w = img.getWidth();
int h = img.getHeight();
int a = size / 2;
//Rotate g2d
AffineTransform rotation = g2d.getTransform();
rotation.rotate(Math.toRadians(degree), a, a);
g2d.setTransform(rotation);
//Calculate where the rotated Image has to be painted to be centered
int x = (size-img.getWidth())/2;
int y = (size-img.getHeight())/2;
//Draw the original image rotated to the new BufferedImage
g2d.drawImage(img, x, y, w, h, null);
g2d.dispose();
//System.out.println(rotatedImage.getWidth());
degree += speed;
if (degree % 360 == 0)
degree = 0;
System.out.println(((float) (System.nanoTime() - t) / 1000000));
return rotatedImage;
}
Hier der Code, der das Bild dreht. Am Ende wird noch die benötigte Zeit in Millisekunden ausgegeben.
Code:
getImage()
Die Zeiten hab ich aus der Konsole in ein Tabellendokument kopiert und mir die Werte mal genauer angeschaut.
Das Dokument findet ihr hier: Tabelle
Beachtet auch die anderen Sheets. Da findet man noch ein paar Diagramme die das ganze schöner veranschaulichen.
Kann mir vielleicht jemand verraten wo diese extremen Ausschläge herkommen? Immerhin liegen die gerade bei den kleineren Grafiken in einer mir nicht erklärbaren höhe.
Danke für eure Hilfe
Gruß Max