Pregunta

Estoy tratando de lograr un mejor rendimiento para mi Java SWT aplicación, y me acabo de enterar de que es posible utilizar OpenGL en SWT.Parece que hay más de uno Java vinculante para OpenGL.¿Cuál te gusta más?

Tenga en cuenta que nunca he usado OpenGL antes, y que la aplicación necesita para funcionar en Windows, Linux y Mac OS X.

¿Fue útil?

Solución

JOGL

Mis razones puede ser citado fuera de las relacionadas anteriormente sitio:

JOGL proporciona acceso total a la Api de OpenGL 2.0 de la especificación, así como casi todas las extensiones de fabricantes, y se integra con el AWT y Swing widget de conjuntos.

También si usted quiere tener un poco de diversión de aprendizaje y hurgando, Procesamiento de es una excelente manera de empezar (Procesamiento también se utiliza JOGL btw...)

Otros consejos

Yo sugeriría que la comprobación hacia fuera LWJGL, el Ligero Java Biblioteca de juegos.Tiene OpenGL enlaces, pero también tiene OpenAL enlaces y algunos buenos tutoriales para empezar.

Sólo ten en cuenta que el Swing/SWT y OpenGL se utilizan generalmente para cosas totalmente distintas.Usted puede terminar encima de querer usar una combinación de ambos.Sólo trate de LWJGL y ver cómo encaja con lo que estás haciendo.

JOGL es, probablemente, la única opción que vale la pena considerar.Aviso de que hay al menos dos opciones para la integración a una SWT aplicación.Hay un GLCanvas que pertenece a la SWT y un GLCanvas que pertenece a AWT.El uno en la SWT no es función completa y no es realmente mantienen.Es mucho mejor utilizar el AWT GLCanvas dentro de un SWT_AWT contenedor.El código de un proyecto reciente:

import org.eclipse.swt.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;

import javax.media.opengl.*;
import javax.media.opengl.glu.*;

import org.eclipse.swt.awt.SWT_AWT;
import org.eclipse.swt.events.*;

public class Main implements GLEventListener
{
    public static void main(String[] args) 
    {
        Display display = new Display();
    Main main = new Main();
    main.runMain(display);
    display.dispose();
}

void runMain(Display display)
{
    final Shell shell = new Shell(display);
    shell.setText("Q*bert 3D - OpenGL Exercise");
    GridLayout gridLayout = new GridLayout();
    gridLayout.marginHeight = 0;
    gridLayout.marginWidth = 0;

    shell.setLayout(gridLayout);

    // this allows us to set particular properties for the GLCanvas
    GLCapabilities glCapabilities = new GLCapabilities();

    glCapabilities.setDoubleBuffered(true);
    glCapabilities.setHardwareAccelerated(true);

    // instantiate the canvas
    final GLCanvas canvas = new GLCanvas(glCapabilities);

    // we can't use the default Composite because using the AWT bridge
    // requires that it have the property of SWT.EMBEDDED
    Composite composite = new Composite(shell, SWT.EMBEDDED);
    GridData ld = new GridData(GridData.FILL_BOTH);
    composite.setLayoutData(ld);

    // set the internal layout so our canvas fills the whole control
    FillLayout clayout = new FillLayout();
    composite.setLayout(clayout);

    // create the special frame bridge to AWT
    java.awt.Frame glFrame = SWT_AWT.new_Frame(composite);
    // we need the listener so we get the GL events
    canvas.addGLEventListener(this);

    // finally, add our canvas as a child of the frame
    glFrame.add(canvas);

    // show it all
    shell.open();
    // the event loop.
    while (!shell.isDisposed ()) {
        if (!display.readAndDispatch ()) display.sleep ();
    }
}

JOGL daremos el mejor rendimiento y portabilidad.Pero ser consciente de que el aprendizaje JOGL, que es esencialmente lo mismo como el aprendizaje de OpenGL, no es fácil.

Personalmente, aún no soy consciente de Java enlaces para OpenGL otros que JOGL - Creo que JOGL es prácticamente el estándar de Java OpenGL.

Funciona en Windows, Linux y OS X, pero es posible que desee leer la documentación oficial para algunas notas acerca de problemas específicos en cada plataforma.

Tenga en cuenta que el OpenGL paradigma es bastante diferente de Swing/AWT o el Java API 2D;OpenGL no es una gota en el reemplazo para el Swing.

Hemos tenido un montón de suerte en el trabajo con JOGL.La nueva versión 2.0 está en http://jogamp.org/ (la última, "la vieja" es la versión en http://download.java.net/media/jogl/builds/archive/jsr-231-1.1.1a/).

Para JOGL 2 con SWT en concreto, tengo una serie de tutoriales de partida en http://wadeawalker.wordpress.com/2010/10/09/tutorial-a-cross-platform-workbench-program-using-java-opengl-and-eclipse/ que muestra exactamente cómo hacer de la cruz-plataforma de JOGL SWT aplicaciones, que se completan con instalable binarios nativos.

O si usted no desea utilizar Eclipse RCP, aquí una simple ejemplo que sólo dibuja un triángulo con JOGL 2 y SWT.Para construir, poner en un proyecto, con swt.jar (a partir de http://www.eclipse.org/swt/) y la última JOGL autobuild .jar y .los archivos dll (de http://jogamp.org/).El único problema con este simple ejemplo es que no va a ser multiplataforma sin un poco de ayuda extra -- usted necesita la capacidad que Eclipse RCP da el paquete de varios conjuntos de la plataforma de bibliotecas juntos en un proyecto.

package name.wadewalker.onetriangle;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.opengl.GLCanvas;
import org.eclipse.swt.opengl.GLData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;

import javax.media.opengl.GL;
import javax.media.opengl.GLProfile;
import javax.media.opengl.GL2;
import javax.media.opengl.GLContext;
import javax.media.opengl.GLDrawableFactory;
import javax.media.opengl.glu.GLU;

public class OneTriangle {

    public static void main(String [] args) {
        GLProfile.initSingleton( true );

        GLProfile glprofile = GLProfile.get( GLProfile.GL2 );

        Display display = new Display();
        Shell shell = new Shell( display );
        shell.setLayout( new FillLayout() );
        Composite composite = new Composite( shell, SWT.NONE );
        composite.setLayout( new FillLayout() );

        GLData gldata = new GLData();
        gldata.doubleBuffer = true;
        // need SWT.NO_BACKGROUND to prevent SWT from clearing the window
        // at the wrong times (we use glClear for this instead)
        final GLCanvas glcanvas = new GLCanvas( composite, SWT.NO_BACKGROUND, gldata );
        glcanvas.setCurrent();
        final GLContext glcontext = GLDrawableFactory.getFactory( glprofile ).createExternalGLContext();

        // fix the viewport when the user resizes the window
        glcanvas.addListener( SWT.Resize, new Listener() {
            public void handleEvent(Event event) {
                setup( glcanvas, glcontext );
            }
        });

        // draw the triangle when the OS tells us that any part of the window needs drawing
        glcanvas.addPaintListener( new PaintListener() {
            public void paintControl( PaintEvent paintevent ) {
                render( glcanvas, glcontext );
            }
        });

        shell.setText( "OneTriangle" );
        shell.setSize( 640, 480 );
        shell.open();

        while( !shell.isDisposed() ) {
            if( !display.readAndDispatch() )
                display.sleep();
        }

        glcanvas.dispose();
        display.dispose();
    }

    private static void setup( GLCanvas glcanvas, GLContext glcontext ) {
        Rectangle rectangle = glcanvas.getClientArea();

        glcanvas.setCurrent();
        glcontext.makeCurrent();

        GL2 gl = glcontext.getGL().getGL2();
        gl.glMatrixMode( GL2.GL_PROJECTION );
        gl.glLoadIdentity();

        // coordinate system origin at lower left with width and height same as the window
        GLU glu = new GLU();
        glu.gluOrtho2D( 0.0f, rectangle.width, 0.0f, rectangle.height );

        gl.glMatrixMode( GL2.GL_MODELVIEW );
        gl.glLoadIdentity();

        gl.glViewport( 0, 0, rectangle.width, rectangle.height );
        glcontext.release();        
    }

    private static void render( GLCanvas glcanvas, GLContext glcontext ) {
        Rectangle rectangle = glcanvas.getClientArea();

        glcanvas.setCurrent();
        glcontext.makeCurrent();

        GL2 gl = glcontext.getGL().getGL2();
        gl.glClear( GL.GL_COLOR_BUFFER_BIT );

        // draw a triangle filling the window
        gl.glLoadIdentity();
        gl.glBegin( GL.GL_TRIANGLES );
        gl.glColor3f( 1, 0, 0 );
        gl.glVertex2f( 0, 0 );
        gl.glColor3f( 0, 1, 0 );
        gl.glVertex2f( rectangle.width, 0 );
        gl.glColor3f( 0, 0, 1 );
        gl.glVertex2f( rectangle.width / 2, rectangle.height );
        gl.glEnd();

        glcanvas.swapBuffers();
        glcontext.release();        
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top