Требуется ли более двойная буферизация?

Как сегодня карты, похоже, сохраняют список команд рендеринга и скрываются только при вызове glFlush или glFinish, нужна ли двойная буферизация? Игра OpenGL, которую я разрабатываю на Linux (карта ATI Mobility radeon) с SDL/OpenGL, на самом деле меньше мерцает, когда SDL_GL_swapbuffers() заменяется на glFinish() и SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,0) в коде инициализации. Является ли это частным случаем моей карты или такие вещи вероятны на всех карточках?

EDIT: Я обнаружил, что причиной этого является KWin. Похоже, что, как сказал дантенволф, композиция без синхронизации была причиной. Когда я отключил композицию KWin, игра отлично работает без ЛЮБЫХ патчей исходного кода.

Ответы

Ответ 1

Двойная буферизация и glFinish - две разные вещи.

glFinish блокирует программу, пока все операции рисования не будут завершены.

Двойная буферизация используется для скрытия процесса рендеринга от пользователя. Без двойной буферизации каждая операция рисования сразу становится видимой, если предположить, что частота обновления дисплея бесконечно высока. На практике вы получите некоторые артефакты отображения, такие как части сцены, видимые в одном состоянии, остальные не видны или в каком-либо другом состоянии, изображение может быть неполным и т.д. Двойная буферизация позволяет избежать этого путем первого рендеринга в задний буфер и только после того, как рендеринг был завершен, заменяя его назад передним буфером, который отправляется на устройство отображения.

Теперь теперь управление компоновкой окон становится широко распространенным: Windows имеет Aero, MacOS X Quartz Extreme и Linux, по крайней мере, Unity и оболочку GNOME3 используют компоновку, если они доступны. Дело в том, что композиция технически создает двойное буферирование: Windows рисует на внеуровневые буферы, и из них последний экран компонуется. Поэтому, если вы работаете на машине с компоновкой, тогда двойная буферизация является избыточной, если она выполняется в вашей программе, и все, что потребуется, - это какой-то механизм синхронизации, чтобы рассказать композитору о готовности следующего кадра. MacOS X имеет это. X11 все еще не имеет правильной схемы синхронизации, см. Этот пост в maillist: http://lists.freedesktop.org/archives/xorg/2004-May/000607.html

TL; DR: Двойная буферизация и glFinish - разные вещи, и вам нужна двойная буферизация (что-то вроде), чтобы все выглядело хорошо.

Ответ 2

Я бы ожидал, что это больше связано с тем, что вы делаете, или с вашим оборудованием, чем с чем-либо, что может быть обобщено на что-то не на вашей машине. Итак, нет: не пытайтесь это сделать.

О, и не забывайте мультисэмплинг. Многие реализации только мультисэмплируют задний буфер; передний буфер не мультисэмплирован. Выполнение свопинга будет уменьшаться из мультисэмплированного буфера.