You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 01:15:27