Нужна ли двойная буферизация - PullRequest
14 голосов
/ 01 июля 2011

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

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

Ответы [ 2 ]

19 голосов
/ 01 июля 2011

Двойная буферизация и 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 - это разные вещи, и вам нужна двойная буферизация (какого-то рода), чтобы все выглядело хорошо.

2 голосов
/ 01 июля 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...