OpenGL максимум 32 экранных окон с Vista / 7 - PullRequest
7 голосов
/ 08 января 2012

Прежде чем я приведу это к разумному примеру, я надеялся, что кто-то мог столкнуться с этим раньше и может пролить свет на проблему.

У меня есть 32-битное приложение на основе Си, которое использует один контекст OpenGLдля каждого окна все контексты и окна устанавливаются одинаково.Требуемый формат пикселей: 32-битный цвет, альфа, буфер глубины, ускоренный.Все работает безупречно в Windows 2000 и XP.

Все работает безупречно в Vista и 7, пока не будет создана 33-я пара окно / контекст.Создание окна не имеет ошибок, создание контекста не имеет ошибок, создание текущего контекста не имеет ошибок, рисование не вызывает ошибок, SwapBuffers не генерирует ошибку.Тем не менее, контексты OpenGL не дают никакого вывода, с Aero окна белые, в классическом режиме они не рисуются и являются просто мусором экрана.Убийство DWM не решает проблему, пробуя разные форматы пикселей (одиночный буфер, различные глубины и т. Д.), А PFD_SUPPORT_COMPOSITION не решает проблему.Это на нескольких разных машинах с Vista / 7, а не с XP.

Я могу glReadPixels задний буфер, и они являются правильными пикселями.Рендеринг в pbuffer с тем же контекстом работает нормально, а рендеринг в> 32 pbuffers - в порядке.

Если я освобождаю рабочие контексты / окна на экране, нерабочие окна снова начинают работать.Это как если бы Vista / 7 просто перестала отображать рендеринг OpenGL после того, как на экране появилось 32 окна.

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

Интересно, это ограничение ОС или драйвера в Vista / 7.Спасибо за понимание.

1 Ответ

2 голосов
/ 11 января 2012

Ограничение зависит от реализации, и все, что вы можете сделать, - это запустить несколько тестов на обычном оборудовании.

Я сам провел несколько тестов, и оказалось, что ограничение довольно велико для карт GeForce (возможно,даже без ограничений).Для настольного Quadro было ограничение в 128 контекстов, которые могли корректно перерисовываться, программа могла создавать еще 128 контекстов без ошибок, но окна содержали мусор.Я не использую PFD_SUPPORT_GDI.

Это было еще интереснее на ATi Radeon 6950, там перерисовка остановилась в окне # 105, а создание контекста рендеринга # 200 не удалось.

Если вы хотитеПопробуйте сами, программу можно найти здесь: Макс. тест контекстов OpenGL (есть полный исходный код + бинарные файлы win32).Может быть, вы можете посмотреть на код и отследить виновника, было бы очень интересно услышать об этом.

Вот и результат.Один совет - по возможности избегайте использования нескольких контекстов.В приложениях, работающих на нескольких мониторах, можно понимать несколько контекстов, но приложения на одном мониторе должны прибегать к одному контексту.Переключение контекста происходит медленно.И это еще не все.Приложения, в которых окна OpenGL перекрываются другими окнами, требуют областей аппаратного ограничения.В GeForce есть одна область отсечения аппаратного обеспечения, в Quadro - восемь или более (приложения САПР часто используют окна и меню, которые перекрывают окно OpenGL, в отличие от игр).Если требуется больше регионов, рендеринг возвращается к программному обеспечению - и снова - наличие большого количества окон OpenGL (контекстов) не очень хорошая идея.

Обратите внимание, что это довольно похоже на Есть ли ограничениесколько контекстов рендеринга OpenGL вы можете создать одновременно?

...