GetDC ReleaseDC在特定上下文中的CPU使用率过高

时间:2018-06-19 18:53:23

标签: c++ performance winapi optimization cpu

我一直在试验设备上下文,并从MSDN文档中阅读了很多有关它的内容。 我创建了一个程序,该程序使用双缓冲进行绘画,但遇到一个小问题(这不是一个真正的问题,但从我的角度来说很好奇)。

根据MSDN,在窗口上进行绘制时,应使用BeginPaint和EndPaint;在其他任何地方执行绘制时,应使用releaseDC和getDC。

我决定无论如何都尝试使用GetDC和ReleaseDC,并且设法使其正常工作。唯一的问题是程序生命周期内的CPU使用率非常高。我说的是25%到50%的CPU使用率。

我将发布WM_PAINT中的代码。 感谢您了解为什么会发生这种情况的任何提示。

paintWindow是我自己的函数,它创建屏幕外的DC,渲染帧并将内容复制到hdc。该代码并不重要,因为我100%肯定,与我遇到的问题无关。

以下代码可完美运行。没有高CPU使用率。一切都很棒。

CASE WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
paintWindow(hdc);
EndPaint(hWnd, &ps);

一旦我尝试做这样的事情:

hdc = GetDC(hWnd);
paintWindow(hdc);
ReleaseDC(hWnd, hdc);

除了CPU使用率很高之外,该代码仍然可以像以前一样完美地工作。 这或多或少是一个优化问题,出于自身的好奇心,我想知道背景的确切差异是什么,如果我想实现与BeginPaint和EndPaind相同的功能,该怎么办。

1 个答案:

答案 0 :(得分:3)

The WM_PAINT message由消息检索功能自动生成,只要窗口的一部分无效(通过显式调用InvalidateRect或调整窗口大小或取消显示窗口)。

需要您的WM_PAINT处理程序来验证无效区域,从而告诉系统不再需要绘画。 BeginPaint调用会为您完成此操作。如果您无法验证无效区域,系统将继续生成WM_PAINT消息。

如果您确实想保留基于GetDC的方法(无论出于何种原因;我不知道一个),则必须在返回之前显式调用ValidateRect,这样系统就不会继续生成WM_PAINT消息。