【问题标题】:JOGL Double BufferingJOGL 双缓冲
【发布时间】:2009-10-08 22:45:25
【问题描述】:

在 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) 行不会产生任何影响。

【问题讨论】:

    标签: java graphics jogl


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      RMorrisey 和示例代码在说明使用 glFlush 时不正确。

      swapBuffers 函数必须在绘图结束时执行。

      为了确认这一点:让形状非常快速地制作动画并注意撕裂。如果你得到撕裂,那么你正在做单次绘制,如果你没有,那么你正在使用双缓冲。

      【讨论】:

      • 如果您感到撕裂,可能只是缓冲区交换与屏幕刷新不同步。
      • 双缓冲旨在有意避免这种情况。而是直接在屏幕上绘制,结果缓存在后台,然后新的内存段显示在屏幕上。
      • Steven 所说的是真的……但前提是你按照 finnw 所说的去做。在 JOGL 中,这是通过 GLDrawable 中的(默认:on)AutoSwapBufferMode 完成的(以防 OP 在代码的其他地方手动关闭它)。
      • 这听起来像是 Java 版本会做的事情。无论如何你应该是双缓冲
      【解决方案3】:

      这是一个使用 JOGL 的双缓冲动画示例:

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

      尝试在 display(...) 调用结束时调用 swapBuffers():

      gl.glFlush();
      

      我已经有一段时间没有对 JOGL 做过任何事情了;希望这会有所帮助。

      【讨论】:

      • 两者都需要。 glFlush 刷新多边形管道,将所有内容绘制到视频缓冲区。但是您仍然需要交换缓冲区以使结果在屏幕上可见。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-14
      • 2011-03-05
      • 2011-08-20
      • 2011-04-23
      • 2011-10-16
      • 2012-01-19
      相关资源
      最近更新 更多