JOGL双缓冲

时间:2009-10-08 22:45:26

标签: java graphics jogl

在JOGL(Java OpenGL)中实现双缓冲的合格方式是什么?

我试图通过以下代码来做到这一点:

...    

/** Creating canvas. */
GLCapabilities capabilities = new GLCapabilities();
capabilities.setDoubleBuffered(true);
GLCanvas canvas = new GLCanvas(capabilities);

...

/** Function display(…), which draws a white Rectangle on a black background. */
public void display(GLAutoDrawable drawable) {
    drawable.swapBuffers();

    gl = drawable.getGL();

    gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
    gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

    gl.glColor3f(1.0f, 1.0f, 1.0f);

    gl.glBegin(GL.GL_POLYGON);
    gl.glVertex2f(-0.5f, -0.5f);
    gl.glVertex2f(-0.5f, 0.5f);
    gl.glVertex2f(0.5f, 0.5f);
    gl.glVertex2f(0.5f, -0.5f);
    gl.glEnd();
}

...

/** Other functions are empty. */

问题:

- 当我调整窗口大小时,我通常会闪烁。在我看来,我的双缓冲实现中有一个错误。

- 我怀疑,在必须放置函数 swapBuffers 之前或之后(如许多消息来源所说)绘图?正如您所注意到的,我在绘制矩形之前使用函数swapBuffers(drawable.swapBuffers()。否则,我在调整大小后会发出噪音。那么这样做的恰当方法是什么?

包含或省略第capabilities.setDoubleBuffered(true)行不会产生任何影响。

3 个答案:

答案 0 :(得分:6)

如果使用GLCanvas,默认情况下autoSwapBuffer模式设置为true,则不必手动调用swapBuffers()。你的闪烁与双缓冲无关,而是将sun.awt.noerasebackground设置为true。

答案 1 :(得分:3)

如果JOGL与C / C ++版本类似:

RMorrisey和示例代码说明使用glFlush是不正确的。

swapBuffers函数必须位于图形的末尾。

要确认这一点:让形状快速动画并注意撕裂。如果你撕裂那么你正在做一次抽奖,如果你没有,那么你正在使用双缓冲。

答案 2 :(得分:1)

以下是使用JOGL的双缓冲动画示例:

http://www.java-tips.org/other-api-tips/jogl/how-to-implement-a-simple-double-buffered-animation-with-mouse-e.html

在显示(...)调用结束时尝试而不是调用swapBuffers():

gl.glFlush();

我用JOGL做了一段时间已经有一段时间了;希望这有帮助。