我正在学习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对象”选择列。