Нужна ли двойная буферизация?

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

РЕДАКТИРОВАТЬ: я обнаружил, что причиной этого является KWin. Похоже, что, как сказал datenwolf, композитинг без синхронизации был причиной. Когда я выключил композитинг KWin, игра отлично работает без каких-либо патчей исходного кода

2 ответа

Решение

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

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

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

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

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

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

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

Другие вопросы по тегам