JOGL Двойная буферизация - PullRequest
       16

JOGL Двойная буферизация

3 голосов
/ 09 октября 2009

Какой приемлемый способ реализовать двойную буферизацию в 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 ]

6 голосов
/ 20 октября 2011

Если вы используете GLCanvas, для режима autoSwapBuffer по умолчанию установлено значение true, вам не нужно вызывать swapBuffers () вручную. Ваше мерцание не имеет ничего общего с двойной буферизацией, а установите для sun.awt.noerasebackground значение true.

3 голосов
/ 09 октября 2009

Если JOGL похож на версию C / C ++:

RMorrisey и пример кода неверен при указании использования glFlush.

Функция swapBuffers должна идти в конце чертежа.

Чтобы подтвердить это: заставьте фигуры выполнять анимацию очень быстро и следите за разрывом. Если вы получаете разрыв, то вы делаете одну ничью, если нет, то вы используете двойную буферизацию.

1 голос
/ 09 октября 2009

Вот пример анимации с двойной буферизацией с использованием JOGL:

http://www.java -tips.org / другие-апи-советы / JOGL / как к орудию-а-простой двойной буферизацией-анимации-с-мыши-e.html

Попробуйте вместо вызова swapBuffers () в конце отображения (...) вызвать:

gl.glFlush();

Уже давно я ничего не делал с JOGL; надеюсь, это поможет.

...