我正在学习OpenGL并使用windows api进行窗口化。我有一个渲染函数,最后调用SwapBuffers(deviceContext)
。
起初我使用GetDC()
来获取DC句柄(如下所示:SwapBuffers(GetDC(hWND))
,它运行顺畅(不释放)。
当我试图将渲染移动到一个单独的线程时,它会在GetDC()
显着减速之后正常工作几百帧,就像返回时间不到1毫秒,突然超过300毫秒。这导致FPS降低。在找到根本原因后,我改为在开始时存储DC一次并在退出时释放,现在它正在工作。
问题是为什么GetDC()
没有ReleaseDC()
如此激烈和突然减慢,当我在窗口类的单独线程中调用它几百次?它不在主线程中。
答案 0 :(得分:1)
MSDN文档中对此进行了解释:
使用公共DC绘制后,必须调用
ReleaseDC
函数 释放DC。不必发布类和私有DC。 必须从调用ReleaseDC
的相同主题调用GetDC
。该 DC的数量仅受可用内存的限制。
因此不应该像这样使用该函数: 。始终获取SwapBuffers(GetDC(hWND))
HDC
句柄并致电ReleaseDC
以避免资源泄漏。
该程序可以顺利运行(至少暂时)但仍会泄漏资源,最终会崩溃。
您可以在任务管理器中监控GDI泄漏。转到“进程”选项卡,选择“GDI对象”列。