GetDC ReleaseDC high CPU usage in specific context
GetDC ReleaseDC high CPU usage in specific context
我一直在尝试使用设备上下文,并从 MSDN 文档中阅读了很多相关内容。
我创建了一个用双缓冲进行绘画的程序,我 运行 遇到了一个小问题(不是真正的问题,但出于我的好奇心)。
根据 MSDN,只要在 window 上绘图,就应该使用 BeginPaint 和 EndPaint,而在其他任何地方执行绘图时,都应该使用 releaseDC 和 getDC。
无论如何,我决定尝试使用 GetDC 和 ReleaseDC,并且设法让它工作 唯一的问题是 CPU 在我的程序生命周期内的使用率非常高。我说的是 25% 到 50% CPU 使用率。
我将 post 我在 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 相同的东西,我应该怎么做。
The WM_PAINT message is autogenerated by the message-retrieval functions, whenever part of a window is invalidated, either through an explicit call to InvalidateRect,或者当 window 调整大小或未覆盖时。
您的 WM_PAINT
处理程序需要验证无效区域,告诉系统不再需要绘制。 BeginPaint 调用会为您完成此操作。如果您未能验证无效区域,系统将继续生成 WM_PAINT
消息。
如果您确实想保留基于 GetDC
的方法(无论出于何种原因;我一个都不知道),您将必须在之前明确调用 ValidateRect返回,这样系统就不会继续产生WM_PAINT
条消息。
我一直在尝试使用设备上下文,并从 MSDN 文档中阅读了很多相关内容。 我创建了一个用双缓冲进行绘画的程序,我 运行 遇到了一个小问题(不是真正的问题,但出于我的好奇心)。
根据 MSDN,只要在 window 上绘图,就应该使用 BeginPaint 和 EndPaint,而在其他任何地方执行绘图时,都应该使用 releaseDC 和 getDC。
无论如何,我决定尝试使用 GetDC 和 ReleaseDC,并且设法让它工作 唯一的问题是 CPU 在我的程序生命周期内的使用率非常高。我说的是 25% 到 50% CPU 使用率。
我将 post 我在 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 相同的东西,我应该怎么做。
The WM_PAINT message is autogenerated by the message-retrieval functions, whenever part of a window is invalidated, either through an explicit call to InvalidateRect,或者当 window 调整大小或未覆盖时。
您的 WM_PAINT
处理程序需要验证无效区域,告诉系统不再需要绘制。 BeginPaint 调用会为您完成此操作。如果您未能验证无效区域,系统将继续生成 WM_PAINT
消息。
如果您确实想保留基于 GetDC
的方法(无论出于何种原因;我一个都不知道),您将必须在之前明确调用 ValidateRect返回,这样系统就不会继续产生WM_PAINT
条消息。