glClientWaitSync导致windows上出现分段错误
更具体地说,我有两个线程 第一个:glClientWaitSync导致windows上出现分段错误,windows,opengl,synchronization,Windows,Opengl,Synchronization,更具体地说,我有两个线程 第一个: 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("
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");
这会导致SEG故障。输出为:
paint
start vsync
所以问题在于glClientWaitSync
,但为什么呢
所以问题在于glClientWaitSync,但为什么呢
因为OpenGL上下文一次只能在一个线程中处于活动状态。多线程OpenGL操作是一件微妙的事情,应该尽可能避免
在您的情况下,必须通过wglGetProcAddress
获取glClientWaitSync
,并且此函数生成的函数指针仅在上下文和检索函数指针时处于活动状态的线程中有效(这是WGL的警告,而不是OpenGL)。其他上下文、其他线程,您需要获得一个新的/不同的函数指针。此外,OpenGL同步对象仅适用于从中创建的上下文
另请注意:
GL\u SYNC\u FLUSH\u命令\u BIT
与V-SYNC无关!当出现glReadPixels
或glCopyTexImage2D
时也可能发生这种情况,这会导致隐式刷新。vsync是由于SwapBuffers
之前的glFenceSync
而发生的,我没有将其包含在代码片段中。@nshy:glWaitClientSync与GL\u SYNC\u flush\u命令\u位一起将触发刷新。所以这显然不是你所期望的。看,嗯,齐平就可以了。SwapBuffers将触发两次冲水。我希望在vsync上发生实际缓冲区交换时,围栏前的交换缓冲区将被视为完成。@nshy:启用V-Sync的交换缓冲区将被阻止,直到V-Sync发生。禁用V-Sync时,隐式刷新完成后,SwapBuffers将立即返回。注意:如果您仍试图超过显示刷新率:为什么?考虑到你不花费渲染时间作为CPU时间的宝贵礼物。AFAIK SWAPBuffs不应该阻止直到完成与VSYNC由于开放的GL规格的异步性质。问题是理论上的兴趣)我想归档是动画,所以当我需要一个帧后,我需要另一个VSYNC。若我将渲染保持在消息循环中,我发现交换缓冲区的最终频率为60Hz,但一段时间后它会阻塞,第一次调用不会。我猜当GPU命令队列已满时,它会阻塞。