4

JMenu オプションをクリックすると、JOGL GLCanvas がちらつきます。

JMenu には、setDefaultLightWeightPopupEnabled が false に設定されています。JGLPanel は実行速度が遅いため、使用したくありません (アプリケーションはフルスクリーン モードで実行する必要があります)。

興味深いことに、コマンド ラインで sun.java2d.opengl=true を設定すると、ちらつきが止まります。しかし、sun がデフォルトでこれを有効にしないという事実は、ユーザーがハードウェアの非互換性で問題を起こすリスクがあるのではないかと心配しています。

メニューをクリックしたときに、他の人が以下のコードでちらつきを見ますか?

JFrame とキャンバスのダブル バッファリング オプションで遊ぶなど、あらゆる種類のことを試しましたが、キャンバスがちらつかないようにすることはできませんでした。

メニューオプションを見たときに、これがちらつかないようにすることはできますか?

ありがとう!

-ダン

import javax.media.opengl.*;
import javax.swing.*;

public class FlickerTest extends JFrame {
    private GLCapabilities m_caps = new GLCapabilities();

    public FlickerTest() {
        super("FlickerTest");

        GLCanvas canvas = new GLCanvas(m_caps);
        add( canvas );
        canvas.addGLEventListener( new MyGLEventListener() );

        setSize( 640, 480 );
        setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

        // false lets the JMenuBar appear on top of the remote image openGL canvas
        JPopupMenu.setDefaultLightWeightPopupEnabled(false);

        setJMenuBar( getMyMenuBar() );
        setVisible( true );
    }

    public static void main(String[] args) {
        new FlickerTest();
    }

    private static JMenuBar getMyMenuBar() {
        JMenuBar menuBar = new JMenuBar();
        JMenu fileMenu = new JMenu("File");
        JMenuItem quitMenuItem = new JMenuItem( "Quit" );
        JMenuItem doSomething = new JMenuItem("Do Something");
        fileMenu.add( quitMenuItem );
        fileMenu.add( doSomething );

        menuBar.add( fileMenu );
        return menuBar;
    }

    private class MyGLEventListener implements GLEventListener {
        private MyGLEventListener() {
        }

        public void init(GLAutoDrawable drawable) {
            GL gl = drawable.getGL();
            gl.glClearColor(1,1,0,0);
            gl.glBlendFunc(GL.GL_ONE,GL.GL_ONE);
            gl.glEnable(GL.GL_BLEND);
        }

        public synchronized void display( GLAutoDrawable p_glAutoDrawable ) {
            GL gl = p_glAutoDrawable.getGL();

            gl.glClear(GL.GL_COLOR_BUFFER_BIT);

            gl.glColor3f(0,0,1);
            gl.glRectf(-.5f,-.5f,.5f,.5f);
            gl.glFlush();
        }

        public void reshape(GLAutoDrawable p_drawable, int x, int y, int w, int h) {
        }

        public void displayChanged(GLAutoDrawable drawable, boolean modeChanged, boolean deviceChanged) {
        }
    }
}
4

3 に答える 3

2

createBufferStrategy(2);JFrame コンストラクターを呼び出してみてください。これにより、JFrame でダブル バッファリングが有効になります。

于 2009-01-06T00:26:58.700 に答える
2

これは、JOGL が GLCanvas を再描画する前に AWT が毎回 GLCanvas を消去することが原因であり、次の行を main() メソッドに挿入することで回避できます。

System.setProperty("sun.awt.noerasebackground", "true");

これにより特定の問題が解決されますが、ウィンドウのサイズを変更するときに表示されるアーティファクトなど、アプリケーションの他の領域で副作用が発生する可能性があります。私はこれをすべての JOGL アプリで使用していますが、問題はありません。

于 2009-02-06T10:18:05.773 に答える