更具体地说,我有两个主题。
第一个:
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
,但为什么呢?
答案 0 :(得分:1)
所以问题出在glClientWaitSync上,但为什么呢?
因为OpenGL上下文一次只能在一个线程中激活。多线程OpenGL操作是一件微妙的事情,应该尽可能避免。
在你的情况下,glClientWaitSync
必须通过wglGetProcAddress
获得,并且此函数产生的函数指针仅在上下文和线程中有效。检索函数指针时激活(这是WGL的警告,而不是OpenGL)。其他上下文,其他线程,你需要获得一个新的/不同的函数指针。此外,OpenGL同步对象仅适用于已从。
旁注:GL_SYNC_FLUSH_COMMANDS_BIT
没有与V-Sync有关!当glReadPixels
或glCopyTexImage2D
出现时,它也可能发生,这会导致隐式刷新。