Win32 OpenGL程序调整窗口大小时SwapBuffers()抛出异常求助
Win32 OpenGL窗口调整大小时SwapBuffers崩溃问题
我正在开发一个基于OpenGL的Win32应用,希望窗口调整大小时能实时更新画面。最初把渲染代码放在主循环里,但调整窗口时DefWindowProc()会进入内部循环,导致主循环无法更新窗口。于是我把渲染代码移到了WM_SIZE消息处理分支里,但用窗口角落调整大小时会抛出异常(用边缘调整则正常)。
我的WindowProc代码
LRESULT CALLBACK windowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_DESTROY: PostQuitMessage(0); return 0; case WM_SIZE: windowWidth = LOWORD(lParam); windowHeight = HIWORD(lParam); glViewport(0, 0, windowWidth, windowHeight); glClear(GL_COLOR_BUFFER_BIT); glDrawArrays(GL_TRIANGLES, 0, 3); SwapBuffers(dc); return 0; } return DefWindowProc(hwnd, msg, wParam, lParam); }
如果注释掉SwapBuffers(dc);,就不会出现错误。
异常信息
Exception thrown at 0x0000024416BFFEAE in Win32OpenGL.exe: 0xC0000005: Access violation reading location 0x000002441DCF5000.
已尝试的解决方法
- 将渲染代码放到
WM_PAINT消息处理分支中 - 用
PeekMessage()替代GetMessage(),试图让主循环在调整窗口时继续运行 - 搜索相关解决方案,但尝试后均无效
补充疑问
查看Microsoft文档中关于SwapBuffers()的说明:
在多线程应用中,调用SwapBuffers前需刷新所有其他绘制到同一窗口的线程中的绘图命令。
windowProc是否在另一个线程运行从而导致问题?“刷新绘图命令”具体是什么意思?
最终解决方案
解决方法:禁用Nahimic服务
说明
我测试了GLFW框架,把渲染代码和glfwSwapBuffers()放到framebuffer_size_callback()中,问题依然存在。随后又在基于GLFW和OpenGL后端的Dear ImGui窗口中测试,问题同样出现。之后在Dear ImGui的相关GitHub issue中确认,本次崩溃是由Nahimic服务(一款音频驱动,与图形及窗口调整无关)的严重bug导致的。
内容的提问来源于stack exchange,提问作者Zachaaaa
相关产品推荐
相关产品推荐

