OpenTK MultiThreading: как «отвязать» GraphicsContext - PullRequest
0 голосов
/ 03 сентября 2018

Я работаю над многопоточным приложением OpenGL с OpenTK 3 и WinForms. У меня есть 2 общих GraphicsContexts:

  • «основной» контекст рендеринга, используемый для рисования сцены и операций синхронной загрузки.
  • «вторичный» контекст загрузчика ресурсов, используемый для загрузки ресурсов во время отрисовки.

Этот вторичный контекст используется для загрузки видеокадров, поступающих из сеанса Windows Media Foundation (с пользовательским приемником мультимедиа). Однако я не имею никакого контроля над тем, в каком потоке работает этот приемник мультимедиа, поэтому мне нужен способ, после каждой операции загрузки, «отсоединять» этот вторичный GraphicsContext, чтобы он мог быть связан в следующем потоке, где он потребуется .

Нужно ли мне P / Invoke wglMakeCurrent (NULL, NULL) или есть подходящий способ OpenTK сделать это?

1 Ответ

0 голосов
/ 03 сентября 2018

Краткий ответ

Используйте функцию OpenTK:

mycontext.MakeCurrent(null);

Длинный ответ

Сегодняшний wglMakeCurrent doc исключил этот старый комментарий:

Если hglrc равен NULL, функция делает текущий поток вызывающим контекст рендеринга больше не актуален и освобождает контекст устройства это используется контекстом рендеринга. В этом случае hdc игнорируется.

Я бы поверил, что комментарий все еще действителен из-за того, что на него полагается так много кода.
Обратите внимание на «освобождает контекст устройства» . Возможно, OpenTK выполняет некоторые действия, связанные с контекстом устройства. Возможно, hdc является приватным (используя флаг стиля окна CS_OWNDC). Итак, пусть OpenTK обрабатывает этот случай "NULL".

Лучший подход

Имейте в виду, что даже при использовании нескольких общих контекстов загрузка выполняется графическим процессором (обычно одной уникальной картой), и не так много карт позволяют загружаться при выполнении других заданий. Таким образом, не гарантируется, что вы получите лучшую производительность. Но как-то для этой цели существуют общие контексты.

Почему вы должны использовать один и тот же контекст в разных потоках?
Я бы использовал другой поток для загрузки видеокадров (без каких-либо вызовов gl) и для загрузки их в графический процессор. Этот последний поток постоянный и имеет свой собственный gl-контекст, поэтому его не нужно устанавливать текущим каждый раз, когда он работает. Он спит или ждет, пока другой поток завершит загрузку данных, и после выполнения этой задачи он загружает эти данные в графический процессор.

...