C++ DX9桌面窗口管理器高CPU
桌面窗口管理器在绘制DX9窗口时使用大量CPU。 我不知道它为什么要用这么多CPU } 参考类CMAIN{ 公众: void StartIt(){Main();} }; int WINAPI WinMain(HINSTANCE HINSTANCE、HINSTANCE hSecInstance、LPSTR nCmdLine、int nCmdShow){ } void SetWindowToTarget(){C++ DX9桌面窗口管理器高CPU,c++,visual-studio,directx,directx-9,C++,Visual Studio,Directx,Directx 9,桌面窗口管理器在绘制DX9窗口时使用大量CPU。 我不知道它为什么要用这么多CPU } 参考类CMAIN{ 公众: void StartIt(){Main();} }; int WINAPI WinMain(HINSTANCE HINSTANCE、HINSTANCE hSecInstance、LPSTR nCmdLine、int nCmdShow){ } void SetWindowToTarget(){ }获取有关您正在尝试执行的操作的更多信息会很有用,而且也很难在代码中准确地看到WM_PA
}获取有关您正在尝试执行的操作的更多信息会很有用,而且也很难在代码中准确地看到WM_PAINT处理程序可能发生的情况(因为您调用了名为
Render
的函数,但不提供该代码)。但乍一看,我认为至少有一件事会导致CPU的高使用率,那就是消息循环。由于调用PeekMessage
,您基本上在该循环中旋转,调用Sleep(12)
,基本上会在该窗口上以80fps的速度更新;由于您使用的是DWM合成代码(DwmExtendFrameIntoClient
),因此我猜测您正在触发DWM中的80Hz更新。如果您在该循环中实时渲染某些内容,那么这就是预期的,而不是可以避免的(除非您将渲染循环放在单独的线程上)。但是如果您只是响应WM_PAINT
消息,那么最好使用使用GetMessage
的消息泵,而不是PeekMessage
,因为GetMessage
将在Windows消息队列为空时挂起线程,只有在需要更新某些内容时,才会触发CPU工作
LRESULT CALLBACK WinProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam){
Sleep(12);
switch (Message){
case WM_PAINT:
Render();
break;
case WM_CREATE:
DwmExtendFrameIntoClientArea(hWnd, &Margin);
break;
case WM_DESTROY:
PostQuitMessage(1);
return 0;
default:
return DefWindowProc(hWnd, Message, wParam, lParam);
break;
}
return 0;
Thread^ main;
CMAIN^ cMain = gcnew CMAIN();
main = gcnew Thread(gcnew ThreadStart(cMain, &CMAIN::StartIt));
main->Name = "main";
main->Start();
CreateThread(0, 0, (LPTHREAD_START_ROUTINE)SetWindowToTarget, 0, 0, 0);
WNDCLASSEX wClass;
wClass.cbClsExtra = NULL;
wClass.cbSize = sizeof(WNDCLASSEX);
wClass.cbWndExtra = NULL;
wClass.hbrBackground = (HBRUSH)CreateSolidBrush(RGB(0, 0, 0));
wClass.hCursor = LoadCursor(0, IDC_ARROW);
wClass.hIcon = LoadIcon(0, IDI_APPLICATION);
wClass.hIconSm = LoadIcon(0, IDI_APPLICATION);
wClass.hInstance = hInstance;
wClass.lpfnWndProc = WinProc;
wClass.lpszClassName = lWindowName;
wClass.lpszMenuName = lWindowName;
wClass.style = CS_VREDRAW | CS_HREDRAW;
if(!RegisterClassEx(&wClass))
exit(1);
tWnd = FindWindow(0, tWindowName);
if (tWnd){
GetWindowRect(tWnd, &tSize);
Width = tSize.right - tSize.left;
Height = tSize.bottom - tSize.top;
hWnd = CreateWindowEx(WS_EX_TOPMOST | WS_EX_TRANSPARENT | WS_EX_LAYERED, lWindowName, lWindowName, WS_POPUP, 1, 1, Width, Height, 0, 0, 0, 0);
SetLayeredWindowAttributes(hWnd, 0, 1.0f, LWA_ALPHA);
SetLayeredWindowAttributes(hWnd, 0, RGB(0, 0, 0), LWA_COLORKEY);
ShowWindow( hWnd, SW_SHOW);
}
DirectXInit(hWnd);
while (!directXExit){
Sleep(12);
if(PeekMessage(&Message, hWnd, 0, 0, PM_REMOVE)){
DispatchMessage(&Message);
TranslateMessage(&Message);
}
}
return 0;
while(true){
tWnd = FindWindow(0, tWindowName);
if (tWnd){
GetWindowRect(tWnd, &tSize);
Width = tSize.right - tSize.left;
Height = tSize.bottom - tSize.top;
DWORD dwStyle = GetWindowLong(tWnd, GWL_STYLE);
if(dwStyle & WS_BORDER){
tSize.top += 23;
Height -= 23;
}
MoveWindow(hWnd, tSize.left, tSize.top, Width, Height, true);
}
Sleep(1500);
}