单独线程中的GetDC函数需要很长时间才能返回

时间:2016-01-15 18:16:18

标签: c++ multithreading winapi

我正在学习OpenGL并使用windows api进行窗口化。我有一个渲染函数,最后调用SwapBuffers(deviceContext)

起初我使用GetDC()来获取DC句柄(如下所示:SwapBuffers(GetDC(hWND)),它运行顺畅(不释放)。 当我试图将渲染移动到一个单独的线程时,它会在GetDC()显着减速之后正常工作几百帧,就像返回时间不到1毫秒,突然超过300毫秒。这导致FPS降低。在找到根本原因后,我改为在开始时存储DC一次并在退出时释放,现在它正在工作。

问题是为什么GetDC()没有ReleaseDC()如此激烈和突然减慢,当我在窗口类的单独线程中调用它几百次?它不在主线程中。

1 个答案:

答案 0 :(得分:1)

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

GetDC function

  

使用公共DC绘制后,必须调用 ReleaseDC 函数   释放DC。不必发布类和私有DC。   必须从调用ReleaseDC相同主题调用GetDC。该   DC的数量仅受可用内存的限制。

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

该程序可以顺利运行(至少暂时)但仍会泄漏资源,最终会崩溃。

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