0

更具体地说,我有两个线程。

第一个:

ev_wait_vsync = CreateEvent(NULL, FALSE, FALSE, "wait_vsync");
...
printf("paint\n");
sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
SetEvent(ev_wait_vsync);

第二个,由第一个创建:

WaitForSingleObject(ev_wait_vsync, INFINITE);
printf("start vsync\n");
glClientWaitSync(sync, GL_SYNC_FLUSH_COMMANDS_BIT, UINT64_MAX);
printf("end sync\n");

这会导致段错误。输出是:

paint
start vsync

所以问题出在glClientWaitSync,但为什么呢?

4

1 回答 1

1

所以问题出在glClientWaitSync,但为什么呢?

因为 OpenGL 上下文一次只能在一个线程中处于活动状态。多线程 OpenGL 操作是一件微妙的事情,应尽可能避免。

在您的情况下发生的情况是,glClientWaitSync必须通过wglGetProcAddress该函数产生的函数指针获得,并且该函数产生的函数指针仅在上下文和检索函数指针时处于活动状态的线程中有效(这是 WGL 的警告,而不是 OpenGL)。其他上下文,其他线程,您需要获取一个新的/不同的函数指针。此外,OpenGL 同步对象仅适用于已创建的上下文。

附带说明:与垂直同步GL_SYNC_FLUSH_COMMANDS_BIT无关!当出现 a或 a时也可能发生这种情况,这会导致隐式刷新。glReadPixelsglCopyTexImage2D

于 2012-09-17T11:05:35.870 回答