我正在学习OpenGL,并使用Windows API进行窗口化。我有一个渲染功能,最后它调用SwapBuffers(deviceContext)

最初,我使用GetDC()来获取DC句柄(如下所示:SwapBuffers(GetDC(hWND))),它工作流畅(没有释放它)。
当我尝试将渲染移到一个单独的线程时,在GetDC()显着放慢之后,它可以正常工作数百帧,就像返回不到1ms并突然超过300ms。这导致FPS降低。找到根本原因后,我开始更改了一次存储DC的权限,并在退出时释放了它,现在可以正常工作了。

问题是,当我在与窗口类不同的线程中将其调用数百次时,为什么没有GetDC()ReleaseDC()会如此急剧而突然地减速?它不在主线程中执行。

最佳答案

MSDN文档中对此进行了解释:

GetDC function


  用通用DC绘画后,必须调用ReleaseDC函数
  释放DC。类别DC和私有DC不必释放。
  ReleaseDC必须从与GetDC相同的线程中调用。的
  DC的数量仅受可用内存的限制。


因此,不应像下面这样使用该函数:SwapBuffers(GetDC(hWND))。始终获取HDC句柄并调用ReleaseDC以避免资源泄漏。

该程序可能运行顺利(至少一段时间),但仍会泄漏资源,最终将导致崩溃。

您可以在任务管理器中监视GDI泄漏。转到“进程”选项卡,为“ GDI对象”选择列。

09-05 09:00