Есть ли ограничение на количество контекстов рендеринга OpenGL, которые вы можете создать одновременно? - PullRequest
12 голосов
/ 10 февраля 2011

Мое приложение .Net Winforms создает три контекста рендеринга OpenGL в моем главном окне, а затем позволяет пользователю открывать другие окна, где у каждого окна есть еще два контекста рендеринга (с использованием сплиттера). Около 26-го контекста рендеринга все начинает идти очень медленно. Вместо отображения нескольких миллисекунд для рендеринга кадра новый контекст рендеринга занимает от 5 до 10 секунд. Это все еще работает, просто очень медленно! И OpenGL НЕ возвращает никаких ошибок (glGetError).

Другие окна работают нормально. Просто новые контексты рендеринга после определенного числа замедляются. Если я закрою эти окна, все будет хорошо - пока я не открою достаточно окон, чтобы преодолеть ограничение. Каждый контекст рендеринга имеет свой собственный поток, и каждый использует простой шейдер. Замедление происходит, когда я загружаю текстуру. Но размер текстуры не влияет на количество контекстов, которые я могу создать, а также размер окна OpenGL.

Я работаю на картах nVidia и вижу это на разных графических процессорах с разным объемом памяти и разными версиями драйверов. В чем дело? Есть ли ограничение на количество контекстов рендеринга, которое может создать приложение?

У кого-нибудь еще есть приложение с множеством контекстов рендеринга, идущих одновременно?

Ответы [ 4 ]

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

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

Мне было скучно на сегодняшнем собрании отдела, поэтому я попытался собрать воединонемного кода, который создает контексты OpenGL и пытается выполнить рендеринг.Я пытался выполнять рендеринг с текстурами и без них, с и без совместимого с форвардом контекста OpenGL.

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

Это было еще интереснее на ATi Radeon6950, там перерисовка остановилась в окне № 105, и создание контекста визуализации № 200 не удалось.

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

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

4 голосов
/ 10 февраля 2011

Лучшая ставка в том, что нет реального ответа на этот вопрос. Вероятно, это зависит от некоторых внутренних ограничений драйвера, аппаратного обеспечения даже ОС. Вы можете попробовать проверить количество доступных текстурных блоков, используя glGet(GL_MAX_TEXTURE_UNITS), но это может или не может быть индикативным.

Распространенным решением, позволяющим избежать этого, является создание нескольких окон просмотра в одном контексте, а не нескольких контекстов в одном окне. Не должно быть слишком сложно объединить два контекста, которые разделяют окно, в один контекст с двумя областями просмотра и каким-то виджетом пользовательского интерфейса, который будет служить в качестве разделителя. Несколько окон - это отдельная история, и вы можете подумать о том, чтобы полностью переосмыслить свой дизайн пользовательского интерфейса, если есть реальная потребность в 26 отдельных окнах OpenGL.
Сейчас мне трудно думать о реальном сценарии использования пользовательского интерфейса, который фактически потребовал бы 26 различных окон OpenGL, работающих одновременно. может быть, другой вариант - создать пул, скажем, 5-10 контекстов и повторно использовать их только в окнах (вкладках?), которые в данный момент видны пользователю. Я не пробовал, но должна быть возможность создать контекст внутри обычного окна, которое больше ничего не содержит, а затем переместить это окно из родительского окна в родительское окно в любое окно верхнего уровня, в котором оно необходимо.

РЕДАКТИРОВАТЬ -
Ну, на самом деле об этом не так уж и сложно думать. В последнем Chrome (9.x.x), поддерживающем WebGL, может потребоваться открыть множество вкладок, каждая из которых имеет контекст WebGL ... Интересно, справляются ли они с этим каким-либо образом. Только что попробовал и исчерпал память после 13 вкладок ... Это на самом деле было бы хорошей проверкой и для вас, чтобы увидеть, если вы что-то делаете неправильно, или Chrome и Firefox (4.0.x-бета) имеют то же самое проблема

0 голосов
/ 21 октября 2017

Если вы столкнетесь с такими большими трудностями при настройке OpenGL многопоточным способом, вы также можете воспользоваться этим и рассмотреть возможность перехода на Vulkan. См., Что по конструкции архитектура OpenGL объединяет все труднодоступные операции рисования, разделенные контекстом / потоками, в один поток драйвера, который затем перераспределяет все эти вызовы по виртуальным аппаратным потокам, которые отображаются в каждом контексте. Драйвер, по сути, является огромным узким местом, потому что он сам по себе не имеет резьбу, несмотря на любое возбуждение, возникающее вокруг. Он просто не предназначен для того, чтобы справляться с этим хорошо.

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

0 голосов
/ 11 февраля 2011

Учитывая разнообразную природу драйверов OpenGL, вам лучше всего проверить поведение основных драйверов (AMD / Intel / NVIDIA / MS Software Render) и при первом запуске запустить тест. Например. если вы видите, что NVIDIA всегда замедляется, как вы видели, просто запустите быстрый цикл, пока не увидите, где находится предел на этой машине (или, скорее, на карте). Это не очень весело, но я думаю, что трудно надёжно раздвинуть границы в противном случае.

Другими словами, «лучшая ставка» такая же, как и ранее, вы не можете знать заранее.

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