Wie kann ich ein hardwarebeschleunigtes Image mit Java2D erstellen?

9

Ich versuche, einen schnellen Bildgenerator zu erstellen, der viele 2D-Transformationen und Shape-Rendering ausführt, also versuche ich, ein BufferedImage zu verwenden und dann das Graphics2D-Objekt zu erhalten, um alle meine Zeichnungen auszuführen. Mein Hauptanliegen ist jetzt, dass es wirklich schnell ist, also erstelle ich ein BufferedImage wie folgt:

%Vor%

Aber wenn ich das tue:

%Vor%

Die Ausgabe ist immer false , auch wenn ich die JVM mit -Dsun.java2d.opengl = True starte, die die Zeile ausgibt:

%Vor%

Ich mache ein BufferedImage, weil ich es am Ende mit ImageIO.write (bImage, "PNG", Datei) in einer PNG-Datei speichern möchte;

Ich kann ein VolatileImage erstellen, das sagt, dass es beschleunigt wird, aber ImageIO mag es nicht, wenn es versucht zu speichern, dass dieses Bild nicht an RenderedImage übergeben werden kann. Irgendwelche Ideen, wie man ein beschleunigtes Bild erhält, das auf der Festplatte gespeichert werden kann? Außerdem möchte ich kein VolatileImage und die Kopie zu einem BufferedImage erstellen, um zu speichern, da meine Bilder wirklich groß sind und ich Probleme mit dem Arbeitsspeicher habe ...

    
Paulo Lopes 03.03.2010, 19:30
quelle

3 Antworten

4

Aus meiner Untersuchung und dem Lesen des Sun / Oracle 2D Tutorials habe ich folgendes gefunden:

Um ein beschleunigtes Bild zu erstellen, kann entweder das flüchtige Bild verwendet werden, das als Puffer erstellt wird. Es gibt Vor- und Nachteile, VolatileImages sind schnell, bis Sie versuchen, die Rasterpixeldaten zu erhalten. In diesem Moment werden sie zu einem normalen gepufferten Bild. Außerdem sind sie unbeständig und es gibt keine Garantie dafür, dass sie am Ende des Renderings verfügbar sind. Dazu führen Sie aus:

%Vor%

Dadurch erhalten Sie ein beschleunigtes Bild, jedoch ist es nicht möglich, das ImageIO zu verwenden, um es direkt zu schreiben, um eine PNG-Datei zu sagen.

Um ein normales BufferedImage zu verwenden, müssen Sie Folgendes tun:

%Vor%

Dies erzeugt ein BufferedImage, das nicht beschleunigt wird, aber Sie geben der JVM einen Hinweis, der in setAccelerationPriority 1 übergeben sollte. Dies können Sie in der 2D-Spur des Java-Lernprogramms nachlesen.

>     
Paulo Lopes 11.03.2010, 16:52
quelle
1

Fügen Sie dies Ihrer Befehlszeile hinzu:

%Vor%

BEARBEITEN

Ich habe etwas darüber gelesen, nachdem Sie gesagt haben, dass das oben nicht funktioniert hat. Versuchen Sie, den True im OpenGL-Parameter so zu ändern, dass er nur aus Kleinbuchstaben besteht.

%Vor%     
Ascalonian 03.03.2010 20:20
quelle
0

So funktioniert es:

Die Art und Weise, wie Sie das Bild erstellen, ist korrekt. Aber Java beschleunigt das Bild nicht sofort. Es gibt einen Schwellenwert für Renderaufrufe, die auf Ihr Bild gerichtet werden müssen, woraufhin das Bild beschleunigt wird. Aber wenn Sie Folgendes festlegen,

%Vor%

Ihr Bild sollte in dem Moment beschleunigt werden, in dem Sie es erstellen.

Sie müssen das Bild möglicherweise noch irgendwie verwenden, damit es beschleunigt wird. Zum Beispiel habe ich das folgende Codestück, das verwendet wird, um ein geladenes Bild (Laden über ImageIO wird Ihnen ein Bild, das nicht beschleunigt werden kann) in mein neues BufferedImage zu kopieren.

%Vor%

Vor diesem Code-Segment wird BufferedImage nicht beschleunigt, danach ist es.

Aber Vorsicht, wenn Sie die Bilddaten direkt bearbeiten (dh nicht über Java-2d), wird Ihr Bild nicht mehr im VRAM zwischengespeichert und Sie müssen es in ein neues Managed Image kopieren, um Ihre Beschleunigung wiederzuerlangen / p>     

Stefan Schmidt 06.03.2010 13:48
quelle