Это отличная функция, поскольку она позволяет мне выполнять параллельные потоки рендеринга.
Доступ к графическому процессору из нескольких потоков в параллельном режиме является серьезным фактором снижения производительности.Не делай этого.Графический процессор будет распараллеливать любой рендеринг внутри.Все, что вы делаете, это бросает журналы на свои колеса.
Если вы хотите ускорить загрузку ресурсов, изучите буферные объекты и асинхронный доступ.Но избегайте одновременного выполнения нескольких контекстов OpenGL в отдельных потоках.
Но так как я использую CreateContextAttribs, я предлагаю возможность запросить конкретную реализацию OpenGL.Таким образом, может случиться так, что один контекст реализует версию 3.2+, в то время как другой реализует версию 2.1.
На самом деле работает довольно хорошо, но я подозреваю, что этот способ действия скрывает некоторый побочный эффект.Какой список проблем может возникнуть при использовании контекстов с разными версиями?
Это на самом деле очень хороший вопрос.И спецификация четко отвечает на это:
1) Can different GL context versions share data?
PROPOSED: Yes, with restrictions as defined by the supported feature
sets. For example, program and shader objects cannot be shared with
OpenGL 1.x contexts, which do not support them.
NOTE: When the new object model is introduced, sharing must be
established at creation time, since the object handle namespace is
also shared. wglShareLists would therefore fail if either context
parameter to it were to be a context supporting the new object
model.
Помимо этого, я запрашиваю реализованные расширения для каждой версии контекста, так как полагаю, что разные версии могут поддерживать разные расширения,это правильно?
Действительно, запрос набора поддерживаемых расширений для каждого контекста - это правильная вещь.
А как насчет указателей на функции?Я должен запросить их для каждого контекста с другой версией (действительно, указатели меняются в зависимости от версии)?
В Windows указатели на функции расширения связаны с контекстом.Разумный способ сделать это состоит в том, чтобы иметь
typedef struct OpenGLExtFunctions_S {
GLvoid (*glFoobarEXT)(GLenum, ...);
/* OpenGL function pointers */
} OpenGLExtFunctions;
/* currentContextFunction must be thread loacal since
contexts are active in one thread only */
__declspec(thread) OpenGLExtFunctions *currentContextFunctions;
#define glFoobarEXT (currentContextFunctions->glFoobarEXT);
#define ...
и обернуть wglMakeCurrent
и wglMakeContextCurrent
некоторой вспомогательной функцией, которая устанавливает указатель currentContextFunctions
на тот из контекста, который становится текущим.Библиотеки-обертки расширений, такие как GLEW, выполняют всю эту тяжелую работу за вас, поэтому вам не нужно беспокоиться о том, чтобы делать это самостоятельно.
В X11 / GLX все гораздо проще: указатели на функции, возвращаемые glXGetProcAddress
, должныодинаково для всех контекстов, поэтому переключать их не нужно.