Wie kann ich eine hardware-beschleunigte Bild mit Java2D?
Ich bin versuchen, um eine schnelle Bild-generator, der nicht viel von 2d Transformationen und shape-rendering, so dass ich versuche, ein BufferedImage und dann erwerben die Graphics2D-Objekt, um alle meine Zeichnung. Meine größte Sorge ist jetzt zu machen ist wirklich schnell, also ich erstelle ein BufferedImage wie diese:
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsConfiguration gc = ge.getDefaultScreenDevice().getDefaultConfiguration();
BufferedImage bImage = gc.createCompatibleImage(width, height, Transparency.TRANSLUCENT);
Graphics2D graphics = bImage.createGraphics();
Allerdings, wenn ich tun:
System.out.println(bImage.getCapabilities(gc).isAccelerated());
Ist die Ausgabe immer false, auch wenn ich die starte die JVM mit dem -Dsun.java2d.opengl=True, druckt die Zeile:
OpenGL pipeline enabled for default config on screen 0
Mache ich ein BufferedImage, denn am Ende will ich, um es zu speichern eine PNG-Datei mit ImageIO.schreiben(abbild zu Formen, "PNG", Datei);
Kann ich ein VolatileImage, die sagen, dass es beschleunigt wird, aber ImageIO mag es nicht, wenn Sie versuchen, zu speichern, zu sagen, dass das Bild nicht gegossen werden, um RenderedImage. Irgendwelche Ideen auf, wie man ein beschleunigtes Bild, das gespeichert werden kann, auf der Festplatte? Ich möchte auch nicht zu schaffen ein VolatileImage und die Kopie in ein BufferedImage zu speichern, da meine Bilder wirklich groß und ich laufen werde, in out-of-memory-Probleme...
- Welche Java-version verwenden Sie?
- Ich bin mit Java6 mit dem Sun JDK
- Kann ich empfehlen, dass Sie implementieren Sie den code, und dann die Zeit, sobald der code ist vorhanden? Auf diese Weise arbeiten Sie heraus, ob es genug Abkühlung zu rechtfertigen versuchen, Sie zu beschleunigen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Aus meiner Untersuchung und Lesen der Sun/Oracle-2D-tutorial dies ist, was ich gefunden habe:
Zu erstellen, die eine beschleunigte Bild kann man entweder die flüchtigen Bild, das erstellt wird, als ein pbuffer. Es gibt Vorteile und Nachteile, VolatileImages sind schnell, bis Sie versuchen, um die raster-pixel-Daten. In diesem moment werden Sie ein normales bufferedImage. Auch Sie sind flüchtig und es gibt keine Garantie, dass es verfügbar sein wird, am Ende Ihrer rendering. Um dies zu tun, führen Sie:
Dieser erhalten Sie ein beschleunigtes Bild, aber es ist nicht möglich, mit dem ImageIO zu schreiben, es direkt zu sagen, eine PNG-Datei.
Um ein normales BufferedImage müssen Sie etwas tun, wie:
Dieser erzeugt ein BufferedImage, das ist nicht beschleunigt, aber Sie geben den Hinweis auf die JVM, das sollte durch die übergabe 1 in setAccelerationPriority. Diese können Sie Lesen auf der 2D-trail of the Java Tutorial.
Versuchen Sie, diese zu Ihrem Befehlszeile:
BEARBEITEN
Habe ich einige Bücher zu Lesen, nachdem Sie gesagt, das oben hat nicht funktioniert. Versuchen Sie, die Wahr auf die OpenGL-parameter werden in Kleinbuchstaben geschrieben.
Hier ist, wie es funktioniert:
Den Weg, die Sie erstellen das Bild korrekt ist. Aber in Java nicht beschleunigen, das Bild sofort. Es gibt ein Schwellenwert, der render-Aufrufe, die müssen gerichtet sein auf deinem Bild, nach dem Bild wird beschleunigt. Aber wenn Sie die folgenden,
euer Bild sollte beschleunigt werden, der moment, Sie schaffen es.
Könnten Sie noch haben, um das Bild irgendwie zu werden beschleunigt. Ich habe zum Beispiel das folgende code-Stück, das zum kopieren eines geladenen Bildes (laden über ImageIO geben Ihnen ein image, das nicht beschleunigt werden) in mein neues BufferedImage.
Bevor dieses code-segment, das BufferedImage ist nicht beschleunigt, danach ist es.
Aber Vorsicht, wenn Sie manipulieren das Bild, die Daten direkt (also nicht über eine Java-2d) und Ihr Bild wird nicht mehr zwischengespeichert werden, in VRAM und kopieren Sie es über, um eine neue Verwaltete Bild, um wieder Ihre Beschleunigung.