Java2D vs OpenGL

Runtime

Top Contributor
Hallo Leute,

ich hab gelesen, dass man in Java die Grafik mit OpenGL rendern lassen kann mithilfe von
Java:
System.setProperty("sun.java2d.opengl", "true");
. Ich habs ausprobiert, aber wenn ich es normal rendern lasse, benötigt es genau gleich viel Zeit (12 millis), wie wenn ich es mit OpenGL rendern lasse.
Test code:
Java:
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Frame;
import java.awt.GradientPaint;
import java.awt.Graphics2D;
import java.awt.Paint;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.awt.geom.Ellipse2D;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferStrategy;

public class Main extends Frame implements WindowListener {
    private boolean running = true;
    private Paint fill;
    private Paint stroke;
    private Shape clip;
    private Shape shape;
    private String fps = "";
    private BufferStrategy s;

    public Main() {
        setSize(1000, 600);
        setIgnoreRepaint(true);
        fill = new GradientPaint(0, 0, Color.blue, 1000, 600, Color.white);
        stroke = Color.black;
        clip = new Ellipse2D.Float(100, 100, 800, 450);
        shape = new RoundRectangle2D.Float(200, 10, 900, 390, 30, 30);
        addWindowListener(this);
        setVisible(true);
        createBufferStrategy(2);
        s = getBufferStrategy();
        while(true) {
                long time = System.nanoTime();
                    Main.this.paintWindow();
                    fps = Long.toString(System.nanoTime() - time) + " nanos";
        }
//        new Thread(new Runnable() {
//
//            public void run() {
//                while(running) {
//                    long time = System.currentTimeMillis();
//                    Main.this.paintWindow();
//                    fps = Long.toString(System.currentTimeMillis() - time) + " millis";
//                }
//            }
//        }).start();
    }

    public void paintWindow() {
        Graphics2D g2 = (Graphics2D) s.getDrawGraphics();
        g2.setPaint(Color.white);
        g2.fillRect(0, 0, getWidth(), getHeight());
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2.setPaint(fill);
        Shape normal = g2.getClip();
        g2.setClip(clip);
        g2.fill(shape);
        g2.setPaint(stroke);
        g2.draw(shape);
        g2.setClip(normal);
        g2.setPaint(Color.black);
        for(int x = 0; x < 18; x++) {
            for(int y = 0; y < 50; y++) {
                g2.drawString("OpenGL", x * 50 + 100, y * 30);
            }
        }
        g2.drawString(fps, 10, 50);
        g2.dispose();
        s.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        System.setProperty("sun.java2d.opengl", "true");
        EventQueue.invokeLater(new Runnable() {

            public void run() {
                new Main().setVisible(true);
            }
        });
    }

    public void windowOpened(WindowEvent e) {
    }

    public void windowClosing(WindowEvent e) {
        System.exit(0);
    }

    public void windowClosed(WindowEvent e) {
    }

    public void windowIconified(WindowEvent e) {
    }

    public void windowDeiconified(WindowEvent e) {
    }

    public void windowActivated(WindowEvent e) {
    }

    public void windowDeactivated(WindowEvent e) {
    }

}
Warum ist OpenGL nicht schneller?
 
M

maki

Gast
Ich habs ausprobiert, aber wenn ich es normal rendern lasse, benötigt es genau gleich viel Zeit (12 millis), wie wenn ich es mit OpenGL rendern lasse.
Ab Java 6 wird von Swing per default OpenGL verwendet falls verfügbar, diese Option in nur in älteren Javaversionen von Bedeutung, imho.
 

Runtime

Top Contributor
1. Wenn ich die Option an habe, dann wird, wenn ich das Frame resize, der Inhalt skaliert, bevor das Frame repaintet wird -> eigenschaft von OpenGL.
2. Warum ist es dann so langsam?
3. Wie kann ich an das GL Objekt kommen?
 

Marco13

Top Contributor
Doch, die Leute bei Sun ;) Im Ernst: Da passiert im Hintergrund SO viel Hardwarenahes und Betriebssystemabhängiges, dass solche Fragen nur schwer zu beantworten sind. Und... was soll ein "GL-Objekt" sein?
 

Marco13

Top Contributor
Aaalso... irgendeine "GL"-Klasse gibt's in Standard Java nicht. Und das ist auch gut so, schließlich solll das ganze ja auch auf Rechnern laufen, die kein passendes GL haben. Und auf jeder Grafikkarte. Und mit 32bit oder 64bit. Und auf Macs. Unter Windows. Linux. Solaris. ARM. ...

Deswgen ist alles, was mit "low-level-Grafikoperationen" (wie sie GL nun mal sind) zu tun hat, "versteckt". Für alle "normalen" Anwendungen ist Swing schnell genug. Für Spiele oder ähnliches, wo es halt wirklich auf die letzte Millisekunde ankommt, nimmt man darum JOGL oder LWJGL - mit den entsprechenden Mehraufwand....
 

Ähnliche Java Themen


Oben