Многопоточный рендеринг на OpenGL

У меня многопоточное приложение, в котором я пытаюсь выполнить рендеринг с разными streamами. Сначала я попытался использовать один и тот же контекст визуализации между всеми streamами, но я получал текущие контексты NULL для других streamов. Я читал в Интернете, что один контекст может быть только в одном streamе за раз.

Поэтому я решил сделать что-то другое. Я создаю окно, я получаю HDC от него и создаю первый RC. Скорее всего, я разделяю этот HDC между streamами, и в каждом новом streamе, который я создаю, я получаю новый RC от того же HDC, и я делаю его актуальным для этого streamа. Каждый раз, когда я это делаю, возвращаемый RC всегда отличается (обычно предыдущее значение + 1). Я делаю утверждение, чтобы проверить, возвращает ли wglGetCurrentContext() RC, и похоже, что он возвращает тот, который был только что создан. Но после создания рендеринга я не получаю рендеринга, и если я вызываю GetLastError() я получаю ошибку 6 (неверный дескриптор ??)

Итак, означает ли это, что, несмотря на то, что каждый новый вызов wglCreateContext() дает мне новое значение, как-то это означает, что все эти разные значения являются одним и тем же «каналом связи» с вызовами OpenGL?

Означает ли это, что мне всегда придется недействить предыдущий контекст визуализации в streamе и активировать его на новом? Мне действительно нужно постоянно выполнять эту синхронизацию или есть ли другой способ работать над этой проблемой?

    У меня многопоточное приложение, в котором я пытаюсь выполнить рендеринг с разными streamами.

    НЕ !!!

    Вы ничего не получите от попытки многопоточного рендеринга. В основном вы работаете в одном большом состоянии гонки, и водитель просто будет занят синхронизацией streamов, чтобы каким-то образом понять это.

    Чтобы получить лучшую производительность рендеринга, все операции OpenGL сохраняются только в одном streamе. Все распараллеливание происходит бесплатно на GPU.

    Предлагаю прочитать следующую статью в вики из Консорциума OpenGL.

    http://www.opengl.org/wiki/OpenGL_and_multithreading

    Говоря простыми словами, это зависит от того, что вы имеете в виду для многопоточности в отношении OpenGl, если у вас есть один stream, выполняющий часть рендеринга, и один (или более) выполняющий другие задания (например, AI, физика, игровая логика и т. Д.), Это совершенно правильно.

    Если вы хотите, чтобы несколько streamов испортились в OpenGL, вы не можете или, лучше, могли бы, но это действительно даст вам больше проблем, чем преимуществ.

    Постарайтесь прочитать следующие часто задаваемые вопросы о параллельном использовании OpenGL, чтобы лучше понять эту концепцию:

    http://www.equalizergraphics.com/documentation/parallelOpenGLFAQ.html

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

    OpenGL на Mac OS X является однопоточным; чтобы включить его:

     #include  CGLError err = 0; CGLContextObj ctx = CGLGetCurrentContext(); // Enable the multi-threading err = CGLEnable( ctx, kCGLCEMPEngine); if (err != kCGLNoError ) { // Multi-threaded execution is possibly not available // Insert your code to take appropriate action } 

    См .: Concurrency и OpenGL – Apple Developer

    И: Техническое Q & A QA1612: multithreading OpenGL ES и …

    Давайте будем гением компьютера.